博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FZU 1894 志愿者选拔 单调队列
阅读量:6821 次
发布时间:2019-06-26

本文共 2126 字,大约阅读时间需要 7 分钟。

题目链接:

Problem Description

 

世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动。
参加志愿者选拔的同学们排队接受面试官们的面试。参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查。
面试中每个人的人品是主要考查对象之一。(提高人品的方法有扶老奶奶过街,不闯红灯等)
作为主面试官的John想知道当前正在接受面试的同学队伍中人品值最高的是多少。于是他请你帮忙编写一个程序来计算。

Input

 

输入数据第一行为一整数T,表示有T组输入数据。每组数据第一行为”START”,表示面试开始
接下来的数据中有三种情况:
  输入 含义
1 C NAME RP_VALUE 名字为NAME的人品值为RP_VALUE的同学加入面试队伍。(名字长度不大于5,0 <= RP_VALUE <= 1,000,000,000)
2 G 排在面试队伍最前面的同学面试结束离开考场。
3 Q 主面试官John想知道当前正在接受面试的队伍中人品最高的值是多少。
最后一行为”END”,表示所有的面试结束,面试的同学们可以依次离开了。
所有参加面试的同学总人数不超过1,000,000

Output

 

对于每个询问Q,输出当前正在接受面试的队伍中人品最高的值,如果当前没有人正在接受面试则输出-1。

Sample Input

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

Sample Output

1000000000 0 -1 200 100 500

Hint

数据较大建议使用scanf,printf 不推荐使用STL

题目分析:使用优先队列会超时,使用线段树超内存,sort一直排序这个肯定不行啦,我也是醉了,只好用单调队列维护顺序;

推荐博客:   

本题AC代码:

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #define LL long long 9 using namespace std;10 const int N = 1000010 ;11 LL queu[N];//原始数组12 LL m_queu[N];//单调递增数组13 int top,base,m_top,m_base;14 int build(LL aa)15 {16 top++;17 queu[top] = aa;//进来一个数存入一个数;18 while(m_top>=m_base)//自顶端向下寻找大于aa的数19 {20 if(m_queu[m_top]>aa) break;21 m_top--;22 23 }24 //如果找到大于aa的数,或者当前队列为空直接存入下一位,空时m_top=-1;25 m_top++;26 m_queu[m_top] = aa;27 }28 int main()29 {30 int T,kk,x,y;31 LL aa;32 char s[10],name[10];33 scanf("%d",&T);34 while(T--)35 {36 scanf("%s",s);37 if(strcmp(s,"START")==0)38 {39 top = -1,base = 0,m_top = -1,m_base =0;//初始化队列40 memset(queu,-1,sizeof(queu));41 memset(m_queu,-1,sizeof(m_queu));42 while(1)43 {44 scanf(" %s",s);45 if(strcmp(s,"END") ==0 ) break;46 else if(s[0] == 'C')47 {48 scanf("%s %lld",name,&aa);49 build(aa);50 }51 else if(s[0] == 'Q')52 {53 if(m_base>m_top) printf("-1\n");//队列为空54 else printf("%lld\n",m_queu[m_base]);//直接输出顶端元素,即为最大值55 }56 //此处容易产生疑惑,已经删除的数会不会出现在顶端呢;57 //答案是会的,当且仅当queue[top] == m_queue[m_top]时会出现在顶端58 else if(s[0] == 'G')59 {60 //如果顶端数等于要删除的数字,则单调队列底部上移一位;原始队列上移一位61 if(queu[base] == m_queu[m_base])62 m_base++;63 base++;64 }65 }66 }67 }68 return 0;69 }

 

转载地址:http://ozozl.baihongyu.com/

你可能感兴趣的文章
freeswitch实战经验1:服务器向成员主动发起会议邀请
查看>>
python转换文本编码和windows换行符
查看>>
try-catch中导致全局变量无法变化的bug
查看>>
Js中数组的操作
查看>>
浏览器缓存 from memory cache与from disk cache详解
查看>>
php编译常用选项
查看>>
Docker Machine 简介
查看>>
Angular4错误提示的说明(一)
查看>>
CCNA+NP学习笔记—交换网络篇
查看>>
一张图说明Linux启动过程
查看>>
Provider处理请求逻辑梳理
查看>>
查看当前服务链接数
查看>>
Open-Falcon 互联网企业级监控系统解决方案(2)
查看>>
抄录一份linux哲学思想
查看>>
cesiumjs开发实践(五) 坐标变换
查看>>
计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...
查看>>
解决本机不能访问虚拟机web服务器网站的问题
查看>>
Proxmox VE 安装、配置、使用之第一章 安装配置
查看>>
java经典算法(猴子吃桃)
查看>>
《linux Shell 脚本攻略》进阶学习(第二部分)
查看>>