PKU 2823 Sliding Window(线段树||RMQ||单调队列)
Posted despair_ghost
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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||单调队列)的主要内容,如果未能解决你的问题,请参考以下文章