首页 > 代码库 > PKU 2823 Sliding Window(线段树||RMQ||单调队列)

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

#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||单调队列)