码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2823

时间:2014-12-06 18:11:08      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:blog   io   os   sp   for   div   log   ad   ef   

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

#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\n",ansb[bt]);
			printf("%d\n",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("\n");
			printf("%d",ansb[0]);
			for(int i=1;i<bt;i++)
			printf(" %d",ansb[i]);
			printf("\n");
		}
	}
	return 0;
}

  

POJ 2823

标签:blog   io   os   sp   for   div   log   ad   ef   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!