1. 程式人生 > >FZU_1894 誌願者選拔 【單調隊列】

FZU_1894 誌願者選拔 【單調隊列】

amp 分析 pac int sin esp div 第一個 %s

1 題面

FZU1894

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\n", query() ); } else if(s[0] == G) { //出隊 pop(); } else { int v; scanf("%s%d", s, &v); insert(v); } } } return 0; }

FZU_1894 誌願者選拔 【單調隊列】