poj 2823 Sliding Window 双向队列,学习

 
刚刚接触队列!!是在惭愧,仔细研读了别人的代码写的!!!!!
用两个队列分别是q1,q2,一个是维护最大值,一个维护最小值,q1里严格遵守从大到小,q2严格遵守从小到大!!!不断输出q1,q2的队首,就是最大值最小值
#include<iostream>
#include<deque>
using namespace std;
const int x=1000010;
int h[x],l[x],a[x];
int main()
{
	int n,k;
	while(scanf("%d%d",&n,&k)!=EOF)
	{
		for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
		deque<int> q1,q2;
		q1.clear();
		q2.clear();
		for(int i=1;i<=n;i++)
		{
			while(!q1.empty()&&a[i]>a[q1.back()])
			q1.pop_back();
			while(!q1.empty()&&i-k+1>q1.front())
			q1.pop_front();
			q1.push_back(i);
			h[i]=a[q1.front()];
			while(!q2.empty()&&a[i]<a[q2.back()])
			q2.pop_back();
			while(!q2.empty()&&i-k+1>q2.front())
			q2.pop_front();
			q2.push_back(i);
			l[i]=a[q2.front()];
		}
		for(int i=k;i<=n;i++)
		{
			if(i==n)
			printf("%d\n",l[i]);
			else
			printf("%d ",l[i]);
		}
		for(int i=k;i<=n;i++)
		{
			if(i==n)
			printf("%d\n",h[i]);
			else
			printf("%d ",h[i]);
		}
	}
	return 0;
}
		
		

你可能感兴趣的:(poj 2823 Sliding Window 双向队列,学习)