FZUOJ 1894 志愿者选拔

FZUOJ 1894 志愿者选拔

从一个数字序列中不断的求当前序列的最大值。采用单调队列。维护一个单调递减的队列,注意删除的时候,比较当前的最大元素即当前的队列头的位置,如果这个位置大于要删除的位置,则不需要移动,否则就将队首指针移动。程序如下:

/*
ID : csuchenan
PROG : fzuoj 1894
LANG : C++
*/

#include
#include

#define MAXN 1000000
#define INF 1000000005

struct Node{
	int pos ;
	int vrp ;
}node[MAXN] ;

void work() ;
void insert_queue(int pos , int val) ;
void pop_node(int pos) ;

int m ;
char str[10] ;

int front ;
int rear  ;

int main(int argc , char * argv){
	
	int test ;
	scanf("%d" , &test) ;
	
	while(test --){
		work() ;
	}
	return 0 ;
}

void work(){
	
	char c  ;
	int val ;
	int i   ;
	int j   ;
	
	scanf("%s" , str) ;
	getchar() ;
	
	i = 1 ;
	j = 1 ;
	
	front = 1 ;
	rear = 0  ;
	node[0].vrp = INF ;
	
	while(1){
		c = getchar() ;
		
		if(c == 'C'){
			
			scanf("%s %d" , str , &val) ;
			
			insert_queue(i , val) ;
			i ++ ;
		}
		else if(c == 'G'){
			pop_node(j) ;
			j ++ ;
		}
		else if(c == 'Q'){
			
			if(front > rear){
				printf("-1") ;
			}
			else 
				printf("%d" , node[front].vrp) ;
			
			printf("\n") ;	
		}
		else{
			scanf("%s" , str) ;
			break ;
		}
		
		getchar() ;
	}
	
	return ; 
}

void insert_queue(int pos , int val){
	
	while(front <= rear && node[rear].vrp < val){
		rear -- ;
	}
	
	rear ++ ;
	node[rear].vrp = val ;
	node[rear].pos = pos ;
	
	return ;
}

void pop_node(int pos){
	
	if(pos >= node[front].pos){
		front ++ ;
	}
	return ;
}




你可能感兴趣的:(单调队列)