从一个数字序列中不断的求当前序列的最大值。采用单调队列。维护一个单调递减的队列,注意删除的时候,比较当前的最大元素即当前的队列头的位置,如果这个位置大于要删除的位置,则不需要移动,否则就将队首指针移动。程序如下:
/*
ID : csuchenan
PROG : fzuoj 1894
LANG : C++
*/
#include<stdio.h>
#include<string.h>
#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 ;
}