P1886 滑动窗口 /【模板】单调队列 单调队列问题,最重要的两点 1)队首出队条件:维护队列元素的个数,如果不能继续入队,弹出队头元素(维护的队列元素个数,是题目要求的区间长度) 2)队尾出队条件:维护队列的单调性,即:通过tail--,尾坐标前移,使得队首始终是当前最大或者当前最小 #include <bits/stdc++.h> using namespace std; const int N=1e6+5; int a[N]; int q[N],p[N]; signed main() { int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int head=0,tail=-1; for(int i=1;i<=n;i++) { while(head<=tail && a[i]<=q[tail]) tail--; // 队尾坐标前移 q[++tail]=a[i]; //入队 p[tail]=i; //记录队首下标 if((i-k)>=p[head]) head++; //队首弹出 if(i>=k) printf("%d ",q[head]); }printf("\n"); head=0,tail=-1; for(int i=1;i<=n;i++) { while(head<=tail && a[i]>=q[tail]) tail--; q[++tail]=a[i]; p[tail]=i; if((i-k)>=p[head]) head++; if(i>=k) printf("%d ",q[head]); }printf("\n"); return 0; }