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

思路:单调队列。

维护一个从变动的起点到当前为区间的最大值。

这里的离队操作只需要判断需要离队的人是否在单调队列中即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <queue>
#include <algorithm>
#define ll long long
#define INF 2139062143
#define inf -2139062144
#define MOD 20071027
#define MAXN 1000005
using namespace std;
int que[MAXN],front,rear;
int arr[MAXN];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        char str[10],name[10];
        int val,g=0,n=0;
        front=1;
        rear=0;
        scanf("%s",str);
        while(scanf("%s",str)&&str[0]!='E')
        {
            if(str[0]=='C')
            {
                scanf("%s%d",name,&arr[++n]);
                while(front<=rear&&arr[n]>arr[que[rear]]) rear--;
                que[++rear]=n;
            }
            else if(str[0]=='G')
            {
                g++;
                if(front<=rear&&que[front]<=g) front++;
            }
            else if(str[0]=='Q')
            {
                if(front<=rear)
                    printf("%d\n",arr[que[front]]);
                else
                    printf("-1\n");
            }
        }
    }
    return 0;
}


 

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