[笔记]单调队列

单调队列的定义与单调栈的定义基本相同,只是在使用的时候可以支持双端队列

模板题

这个题的思路很简单,但是实现起来并不好写.

总结概括起来就是:求最大值时,维护一个单调递减的队列,队首的元素就是答案,如果遇到了一个比队尾元素大的就从队尾开始弹出元素,直到队列为空或者队列中的一个元素比当前元素大.求最小值也是同理.看看代码就更好理解些.

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;
}
posted @ 2020-10-23 09:42  czyczy  阅读(122)  评论(0编辑  收藏  举报