【单调队列】【2012福建】Rp

这篇博客探讨了在买彩票场景下如何利用单调队列来管理队列中的rp值,确保每次查询时返回队列中人品最高者的rp。在输入格式和输出格式的描述中,说明了数据处理过程,包括新成员加入、离开队列以及查询操作。通过单调队列,可以高效地更新并获取队列中的最大rp值。

    【题目描述】

    买彩票是一件很靠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++;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值