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 ;

}

原文地址:https://www.cnblogs.com/xiaolongchase/p/2344682.html