poj 2823

单调队列的经典题

代码:

#include<iostream>
#include<fstream>
#include<queue>

using namespace std;

#define MAX 1000000

int a[1000001];
int minn[1000001];
int maxx[1000001];
int n,m,f1,r1,f2,r2;

void read(){
//	ifstream cin("in.txt");
	int i,j,k;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(i=1;i<=m;i++)
	{
		while(f1!=r1&&minn[r1]>a[i])
			r1=(r1-1+MAX)%MAX;
		r1=(r1+1)%MAX;
		minn[r1]=a[i];

		while(f2!=r2&&maxx[r2]<a[i])
			r2=(r2-1+MAX)%MAX;
		r2=(r2+1)%MAX;
		maxx[r2]=a[i];

	}
	for(i=m;i<n;i++)
	{
		cout<<minn[(f1+1)%MAX]<<' ';
		if(a[i-m+1]==minn[(f1+1)%MAX])
			f1=(f1+1)%MAX;
		
		while(f1!=r1&&minn[r1]>a[i+1])
			r1=(r1-1+MAX)%MAX;
		r1=(r1+1)%MAX;
		minn[r1]=a[i+1];
	}
	cout<<minn[(f1+1)%MAX]<<endl;

	for(i=m;i<n;i++)
	{
		cout<<maxx[(f2+1)%MAX]<<' ';
		if(a[i-m+1]==maxx[(f2+1)%MAX])
			f2=(f2+1)%MAX;

		while(f2!=r2&&maxx[r2]<a[i+1])
			r2=(r2-1+MAX)%MAX;
		r2=(r2+1)%MAX;
		maxx[r2]=a[i+1];
	}
	cout<<maxx[(f2+1)%MAX]<<endl;
	
}

int main(){
	read();
	return 0;
}

posted on 2011-05-09 19:47  宇宙吾心  阅读(299)  评论(0)    收藏  举报

导航