现在的位置: 首页 > 综合 > 正文

POJ2823单调队列

2019年09月12日 ⁄ 综合 ⁄ 共 1115字 ⁄ 字号 评论关闭

这道题卡输入输出

#include "stdio.h"
#include "cctype"

#define LEN 1000005

struct Window {
	int index;
	int values;
};

struct Window Qu[LEN];

int AllData[LEN];
int n,k;

short Com1(int v1,int v2){
	return (v1 > v2);
}

short Com2(int v1,int v2){
	return (v1 < v2);
}

inline void put(int x){  
	static char s[20];  
	int bas;
	if(x< 0) {
		putchar('-');  
		x = -x;  
	}
	if(x == 0){

		putchar('0');  
		return;  
	}  
	bas = 0;  
	for(;x;x/=10) s[bas++] = x%10+'0';  
	for(;bas--;) putchar(s[bas]);  
}

inline int Rint(){
	char c;
	while(!isdigit(c = getchar()) && c != '-');
	int t, s = 1;
	if (c == '-') s = t = 0;
	else t = c ^ 48;
	while(isdigit(c = getchar()))
		t = (t << 1) + (t << 3) + (c ^ 48);
	return s?t:-t;
}

void ShowValues(short flag){
	int i,r,QMaxHead,j = k - 1;
	if( n > 1){
		short (*fun)(int,int);
		if(flag){
			fun = Com1;
		}
		else{
			fun = Com2;
		}
		Qu[0].index = 0;
		Qu[0].values = AllData[0];
		r = 0;
		QMaxHead = 0;
		if( k == 1){
			put(AllData[0]);
			putchar(' ');
		}
		for( i = 1 ; i < n ; i ++ ){
			if(Qu[QMaxHead].index < i - j){
				QMaxHead ++;
			}
			while( fun(AllData[i],Qu[r].values) && r >= QMaxHead ){
				r --;
			}
			r ++;
			Qu[r].values = AllData[i];
			Qu[r].index = i;
			if(i  >= j ){
				put(Qu[QMaxHead].values);
				putchar(' ');
			}
		}
	}
	if( n == 1){
		printf("%d",AllData[0]);
	}
}

int main(void)
{
	int i;
	scanf("%d %d",&n,&k);
	for( i = 0 ; i < n ; i ++ ){
		AllData[i] = Rint();
	}
	ShowValues(0);
	putchar('\n');
	ShowValues(1);
	putchar('\n');
	return 0;
}

 

【上篇】
【下篇】

抱歉!评论已关闭.