POJ 2823

单调队列来做,简单题了。维护一个最大的,一个最小的即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

#define N 1001000

int num[N];
int bigque[N],bhead,btail;
int smalque[N],shead,stail;
int ansb[N],anss[N],bt,st;

void addbig(int v){
	while(bhead<btail){
		if(v>bigque[btail-1])
		btail--;
		else break;
	}
	bigque[btail++]=v;
}

void addsmall(int v){
	while(shead<stail){
		if(v<smalque[stail-1])
		stail--;
		else break;
	}
	smalque[stail++]=v;
}

int main(){
	int n,k;
	while(scanf("%d%d",&n,&k)!=EOF){
		bhead=btail=shead=stail=bt=st=0;
		for(int i=1;i<=n;i++)
		scanf("%d",&num[i]);
		int i;
		for(i=1;i<=k&&i<=n;i++){
			addbig(num[i]);
			addsmall(num[i]);
		//	cout<<"YES"<<endl;
		}
		if(k>=n){
			printf("%d
",ansb[bt]);
			printf("%d
",anss[st]);
		}
		else{
			ansb[bt++]=bigque[bhead];
			anss[st++]=smalque[shead];
			for(;i<=n;i++){
				if(bigque[bhead]==num[i-k]){
					bhead++;
				}
				addbig(num[i]);
				if(smalque[shead]==num[i-k])
				shead++;
				addsmall(num[i]);
				ansb[bt++]=bigque[bhead];
				anss[st++]=smalque[shead];
			}
			printf("%d",anss[0]);
			for(int i=1;i<st;i++)
			printf(" %d",anss[i]);
			printf("
");
			printf("%d",ansb[0]);
			for(int i=1;i<bt;i++)
			printf(" %d",ansb[i]);
			printf("
");
		}
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/jie-dcai/p/4148456.html