码迷,mamicode.com
首页 > Windows程序 > 详细

PKU 2823 Sliding Window(线段树||RMQ||单调队列)

时间:2017-02-21 01:10:53      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:window   span   efi   ret   begin   i++   void   style   单调队列   

#include<cstdio>
#include<algorithm>
#define maxn 1000005
#define inf 0x3f3f3f3f
using namespace std;
int Segtree_min[maxn<<2],Segtree_max[maxn<<2];
int n,k,value;
int begin,end;
//每个结点保存该区间线段的最大/小值
void Build(int l,int r,int pos)
{
    if(l==r){
        scanf("%d",&value);
        Segtree_max[pos]=Segtree_min[pos]=value;
        return ;
    }
    int mid=(l+r)/2;
    Build(l,mid,2*pos);
    Build(mid+1,r,2*pos+1);
    Segtree_min[pos]=min(Segtree_min[2*pos],Segtree_min[2*pos+1]);
    Segtree_max[pos]=max(Segtree_max[2*pos],Segtree_max[2*pos+1]);
}
int Query_min(int ll,int rr,int l,int r,int pos)
{
    if(ll<=l&&r<=rr)
        return Segtree_min[pos];
    int mid=(l+r)/2;
    //int begin=inf,end=inf;
    if(ll<=mid)
        begin=Query_min(ll,rr,l,mid,2*pos);
    if(rr>mid)
        end=Query_min(ll,rr,mid+1,r,2*pos+1);
    return min(begin,end);
}
int Query_max(int ll,int rr,int l,int r,int pos)
{
    if(ll<=l&&r<=rr)
        return Segtree_max[pos];
    int mid=(l+r)/2;
    //int begin=-inf,end=-inf;
    if(ll<=mid)
        begin=Query_max(ll,rr,l,mid,2*pos);
    if(rr>mid)
        end=Query_max(ll,rr,mid+1,r,2*pos+1);
    return max(begin,end);
}

int main()
{
    scanf("%d%d",&n,&k);
    Build(1,n,1);
    for(int i=1;i<=n-k+1;i++)
        printf("%d ",Query_min(i,i+k-1,1,n,1));
    printf("\n");
    for(int i=1;i<=n-k+1;i++)
        printf("%d ",Query_max(i,i+k-1,1,n,1));
    printf("\n");
}

PKU 2823 Sliding Window(线段树||RMQ||单调队列)

标签:window   span   efi   ret   begin   i++   void   style   单调队列   

原文地址:http://www.cnblogs.com/freinds/p/6422198.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!