单调队列的入门题型。学习斜率优化DP的一个铺垫。
需要注意的一点是:虽然单次操作的复杂度可能不是O(1),但是单调队列中的每个元素都只入队和出队了一次,这样平摊下来,单次操作的复杂度仍然是O(1)。
#include<stdio.h> #include<string.h> #define N 1000005 int a[N],mark[N]; int main() { int T; scanf("%d",&T); getchar(); while(T--) { char s[15]; scanf("%s",s); getchar(); int cnt,head,tail; head=tail=0; cnt=0; int i; i=1; while(scanf("%s",s),strcmp(s,"END")!=0) { if(s[0]=='C') { scanf("%s%d",s,&a[i]); while(head<tail&&a[i]>a[mark[tail-1]]) tail--; mark[tail++]=i; i++; } else if(s[0]=='G') { cnt++; if(cnt==mark[head]&&head!=tail) head++; } else if(s[0]=='Q') { if(head==tail) { printf("-1\n"); } else printf("%d\n",a[mark[head]]); } getchar(); } } return 0; }