1 题面
2 分析
单调队列的典型引用
需要注意的是在用维护辅助队列的时候,$L$和$R$的初始化都是0时,队列第一个数就是$L$,最后一个数就是$R-1$。
3 AC代码
#include <cstdio> #include <iostream> using namespace std; const int MAXN = 1e6 + 15; int MQue[MAXN], Que[MAXN]; int L, R, LQ, RQ; void insert(int value) { Que[RQ++] = value; while(L != R && MQue[R-1] <= value) R--; MQue[R++] = value; } int query() { if(L == R) return -1; else return MQue[L]; } void pop() { //把辅助队列里的最大值去掉,因为这个值当前最大 //辅助队列里现在存在的数肯定比该数后到,可以达到维护的效果 if(LQ == RQ) return; if(MQue[L] == Que[LQ]) L++; LQ++; } int main() { //freopen("input.txt", "r", stdin); //freopen("out.txt", "w", stdout); int T; scanf("%d", &T); while(T--) { L = R = 0; LQ = RQ = 0; char s[6], op; scanf("%s", s); while(scanf("%s", s)) { if(s[0] == 'E') break; if(s[0] == 'Q') { //查询 printf("%d ", query() ); } else if(s[0] == 'G') { //出队 pop(); } else { int v; scanf("%s%d", s, &v); insert(v); } } } return 0; }