[笔记]单调队列
单调队列的定义与单调栈的定义基本相同,只是在使用的时候可以支持双端队列
这个题的思路很简单,但是实现起来并不好写.
总结概括起来就是:求最大值时,维护一个单调递减的队列,队首的元素就是答案,如果遇到了一个比队尾元素大的就从队尾开始弹出元素,直到队列为空或者队列中的一个元素比当前元素大.求最小值也是同理.看看代码就更好理解些.
PS:与单调栈相同地都是维护下标而不是直接维护权值
#include <bits/stdc++.h>
using namespace std;
int n,k;
int a[1000010];
deque < int > maxx,minn;
int main(){
scanf("%d%d",&n,&k);
for(int i = 1;i <= n;i++)
scanf("%d",&a[i]);
for(int i = 1;i <= n;i++){
while(!minn.empty() && minn.front() <= i - k)minn.pop_front();
while(!minn.empty() && a[minn.back()] > a[i])minn.pop_back();
minn.push_back(i);
if(i >= k)printf("%d ",a[minn.front()]);
}
printf("\n");
for(int i = 1;i <= n;i++){
while(!maxx.empty() && maxx.front() <= i - k)maxx.pop_front();
while(!maxx.empty() && a[i] > a[maxx.back()])maxx.pop_back();
maxx.push_back(i);
if(i >= k)printf("%d ",a[maxx.front()]);
}
printf("\n");
return 0;
}