洛谷P2032 扫描 单调队列

网址:https://www.luogu.org/problem/P2032

题意:

裸的滑动窗口。

题解:

单调队列一遍过就行。因为有$2e6$个数,推荐C风格读写并手写队列。

AC代码:

#include <iostream>
#include <cstdio>
#include <deque>
using namespace std;
int num[2000005];
struct node
{
	int num,pos;
	node()
	{
		num=0,pos=0;
	}
	node(int a,int b)
	{
		num=a,pos=b;
	}
};
node que[200005];
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;++i)
		scanf("%d",&num[i]);
	//queue
	int head=1,tail=0;
	int i;
	for(i=0;i<m;++i)
	{
		while(head<=tail&&que[tail].num<=num[i])
			--tail;
		que[++tail]=node(num[i],i);
	}
	printf("%d\n",que[head].num);
	for(;i<n;++i)
	{
		while(head<=tail&&que[tail].num<=num[i])
			--tail;
		que[++tail]=node(num[i],i);
		while(que[head].pos<i-m+1)
			++head;
		printf("%d\n",que[head].num);	
	} 
	return 0;
}

 

posted @ 2019-08-04 22:43  Aya_Uchida  阅读(195)  评论(0编辑  收藏  举报