单调队列总结
定义 单调队列,即单调递减或单调递增的队列。 入门题(洛谷P1886滑动窗口) 传送门 题目描述 分析 如果用暴力求解的话,我们要将这一个长度为 \(k\) 的区间扫一遍 但是实际上,有很多值是显然不会对答案产生贡献的 比如我们要维护该区间的最大值,当前队尾的的元素是 \(4\) ,下一个要加进去的元素是 \(5\) 此时队尾一定不会对答案产生贡献,因为它的值比下一个元素小,而且当前值继续对答案产生贡献的时间也更短 这样,我们就相当于维护了一个单调递减的队列 维护区间最小值同理 代码 #include<bits/stdc++.h> using namespace std; const int maxn=1e6+5; typedef long long ll; ll a[maxn]; int q[maxn]; int main(){ int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } int head=1,tail=0; for(int i=1;i<=n;i++){ while(head<=tail && i-q[head]+1>k) head++; while(head<=tail && a[i]<a[q[tail]]) tail--; q[++tail]=i; if(i>=k