【题目描述】
买彩票是一件很靠rp的事。现在有N条信息描述了一个投注站买票人的信息。
new a 表示在队尾来了一个rp为a的人。leave 表示队首的人买完离开,数据保证在次操作之前队列不为空。
query 表示询问当前队列中人品最高的人的rp,数据保证这时队列至少有一个人。
【输入格式】
输入数据第一行为一个正整数N (1 <= N <= 1000000)。
接着N行每行表示一条信息。
【输出格式】
对于每个询问,输出当前队列中最高的rp值。
【样例输入】 【样例输出】
5 30
new 30 20
new 20
query
leave
query
单调队列,如果新输入的数比前面的数大,就把前面的数pop掉,维护单调下降队列即可。
#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
int q[1000005],head=1,tail=0,p[1000005],l=0,l2;
char a[55];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",a);
if(a[0]=='n')
{
int x;
scanf("%d",&x);
while(q[tail]<x&&tail>=head) tail--;
q[++tail]=x;
p[tail]=++l2;//注意编号不是i
}
else if(a[0]=='q')
{
// cout<<tail<<endl;
while(p[head]<=l) head++;
printf("%d\n",q[head]);
}
else
{
l++;
}
}
}