「模板」 单调队列

「模板」 单调队列

<题目链接-单调队列经典例题:滑动窗口>


要保证队列单调增/减。

以增为例——

入队时,如果待入队元素小于队尾元素,队尾就出队,直到满足单调性时进队。

超出范围时队首出队。

STL deque是好东西。

#include <cstdio>
#include <deque>
using namespace std;
const int MAXN=1000010;
int n,k,a[MAXN];
struct node
{
	int v,p;
};
void Solve(bool flag)
{
	deque<node> q;
	for(int i=1;i<=n;++i)
	{
		while(!q.empty() && flag==(a[i]>q.back().v))
			q.pop_back();
		q.push_back((node){a[i],i});
		if(i>=k)
		{
			if(q.front().p<=i-k)
				q.pop_front();
			printf("%d ",q.front().v);
		}
	}
	putchar('\n');
}
int main(int argc,char *argv[])
{
	scanf("%d %d",&n,&k);
	for(int i=1;i<=n;++i)
		scanf("%d",&a[i]);
	Solve(0);
	Solve(1);
	return 0;
}

谢谢阅读

posted @ 2018-01-11 09:21  Capella  阅读(377)  评论(0编辑  收藏  举报

谢谢光临