首页 > 代码库 > 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||单调队列)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。