滑动窗口(单调队列)
模板题,维护一个单减队列和一个单增队列
emmmmm……没啥说的
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int rd(){ int x=0,fl=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')fl=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return fl*x; } int n,k,a[1001000],l,r; struct star{int v,id;}e[1000100]; int main(){ n=rd();k=rd(); for(int i=1;i<=n;i++) a[i]=rd(); l=1;r=0; for(int i=1;i<=n;i++){ while(l<=r&&a[i]<=e[r].v)r--; e[++r].v=a[i];e[r].id=i; while(i-e[l].id+1>k)l++; if(i>=k)printf("%d ",e[l].v); } putchar('\n'); l=1;r=0; for(int i=1;i<=n;i++){ while(l<=r&&a[i]>=e[r].v)r--; e[++r].v=a[i];e[r].id=i; while(i-e[l].id+1>k)l++; if(i>=k)printf("%d ",e[l].v); } return 0; }