志愿者选拔(select.cpp)
(时间限制:2 秒 内存限制:128MB)
【题目描述】 西博会前,某大学组织了一次志愿者选拔活动。参加志愿者选拔的同学们排队接受面试 官们的面试,参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查。 面试中每个人的英语口语能力是主要考查对象之一。 作为主面试官的 John 想知道当前正在接受面试的同学队伍中口语能力值最高的是多少。 于是他请你帮忙编写一个程序来计算。
【输入格式】 输入数据第一行为一整数 T,表示有 T(T≤5)组输入数据。 每组数据第一行为“START”,表示面试开始。 接下来的数据中有三种情况: 情况 1:C NAME KY_VALUE 表示姓名为 NAME 的口语能力值为 KY_VALUE 的同学加入面试队伍。
其中:名字长度不大于 5,0≤KY_VALUE≤1,000,000,000。 情况 2:G 排在面试队伍最前面的同学面试结束离开考场。 情况 3:Q 主面试官 John 想知道当前正在接受面试的队伍中口语能力最高的值是多少。 最后一行为”END”,表示所有的面试结束,面试的同学们可以依次离开了。 所有参加面试的同学总人数不超过 1,000,000。 【输出格式】 对于每个询问 Q ,输出当前正在接受面试的队伍中口语能力最高的值,如果当前没有 人正在接受面试则输出-1。
【样例输入】
2
START
C Tiny 1000000000
C Lina 0
Q
G
Q
END
START
Q
C ccQ 200
C cxw 100
Q
G
Q
C wzc 500
Q
END
【样例输出】
1000000000
0
-1
200
100
500
分析
题目本身就是队列,由于要找的是最大值,我们自然想到用单调队列解决问题。 维护一个单调递减序列,只需输出序列中的第一个元素即可。 对于命令我们可以进行不同的处理:
如果是 Q 命令,则判断当前队列中是否仍有元素,如果没有则输出-1,如果有则直 接输出队首元素即可。
如果是 G 命令,则对 last 加 1,之后对于队列中所有超出范围的前端元素进行出 队操作(该元素在原序列中的位置>=last)。 一个重要性质:就是在你新加入元素之 后,不优于这个新元素的元素都没有存在的必要了。
如果是 C 命令,则将该元素加入队列中,并和队尾元素比较,维护队列的单调性。
注意
q 中的值是该元素在原序列中的位置。
num[L]:存储最大值的下标;q 是队列 。
代码
#include<bits/stdc++.h>
#define numm ch-'0'
using namespace std;
int num