【P1886】滑动窗口(单调队列→线段树→LCT)
这个题很友好,我们可以分别进行简单难度,中等难度,恶心难度来做。然而智商没问题的话肯定是用单调队列来做。。。
板子题,直接裸的单调队列就能过。
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define re register #define wc 0.0000000001 using namespace std; int qmax[1000001],qmin[1000001],n,m,k,a[1000001],maxx[1000001],minn[1000001],num; int h1,t1,h2,t2; inline void smax(int x) { while(h1<=t1&&a[qmax[t1]]<=a[x]) t1--; qmax[++t1]=x; while(qmax[h1]<=x-k) h1++; return; } inline void smin(int x) { while(h2<=t2&&a[qmin[t2]]>=a[x]) t2--; qmin[++t2]=x; while(qmin[h2]<=x-k) h2++; return; } int main() { cin>>n>>k; for(re int i=1;i<=n;i++) { cin>>a[i]; } h1=1,t1=0;h2=1,t2=0; for(re int i=1;i<=n;i++) { smax(i); smin(i); if(i>=k) { maxx[++num]=a[qmax[h1]]; minn[num]=a[qmin[h2]]; } } for(re int i=1;i<=num;i++) cout<<minn[i]<<" "; cout<<endl; for(re int i=1;i<=num;i++) cout<<maxx[i]<<" "; return 0; }
对于作者转载文章,欢迎继续转载。
对于作者原创文章,请注明出处之后转载。