fzu 1894 志愿者选拔 (单调队列)

简单单调队列。

code:

#include<cstdio>
int data[ 1000001] ;
int queue[ 1000001] ;
int num[ 1000001] ;
int h, r, n ;
void insert(){
     if(r==h- 1||data[n]<queue[r]){
        r ++ ;
        queue[r] = data[n] ;
        num[r] = n ;
    }
     else{
         while(r>=h&&data[n]>=queue[r])
            r -- ;
        queue[++r] = data[n] ;
        num[r] = n ;
    }
}
void getMax(){
     if(h>r) printf( " -1\n ") ;
     else    printf( " %d\n ", queue[h]) ;
}
int main(){
     char temp[ 6] ;
     int t, l ;
    scanf( " %d ", &t) ;
     while(t--){
        h = n = l =  0 ;
        r = - 1 ;
        queue[ 0] =  0 ;
        scanf( " %s ", temp) ;
         while( true){
            scanf( " %s ", temp) ;
             if(temp[ 0]== ' C '){
                scanf( " %s ", temp) ;
                scanf( " %d ", &data[n]) ;
                insert() ;
                n ++ ;
            }
             else  if(temp[ 0]== ' Q '){
                 while(r>=h&&num[h]<l)
                    h ++ ;
                getMax() ;
            }
             else  if(temp[ 0]== ' G ')
                l ++ ;
             else  break ;
        }
    }
     return  0 ;

}

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