本题主要解决的问题:
常数时间复杂度范围内获得栈的最大值;
用两个栈模拟一个队列。
细节问题:scanf 和 getchar 获取输入的问题。
问题描述
现有一条单向单车道隧道,每一辆车从隧道的一端驶入,另一端驶出,不允许超车。该隧道对车辆的高度有一定限制,在任意时刻,管理员希望知道此时隧道中最高车辆的高度是多少。
现在请你维护这条隧道的车辆进出记录,并支持查询最高车辆的功能
输入
第一行仅含一个整数,即高度查询和车辆出入操作的总次数n
以下n行,依次这n次操作。各行的格式为以下几种之一:
1. E x //有一辆高度为x的车进入隧道(x为整数)
2. D //有一辆车离开隧道
3. M //查询此时隧道中车辆的最大高度
输出
若D和M操作共计m次,则输出m行
对于每次D操作,输出离开隧道车辆的高度
对于每次M操作,输出所查询到的最大高度
样例
Input
9
E 5
E 6
M
E 2
M
D
M
D
M
Output
6
6
5
6
6
2
限制
0 ≤ n ≤ 2,000,000
0 ≤ x ≤ 2^31 - 1
保证车辆的进出序列是合法的
时间:2 sec
空间:256 MB
提示
如何由多个栈来模拟一个队列?可参考第四章末尾的某习题。
如何实现一个能够高效获取最大值的栈?
如何实现一个可以高效获取最大值的队列?
可参考第04章XA节的讲义以及《习题解析》的[10-19]题、[10-20]题.
先上上源代码:
#include<cstdio>
#include<cstdlib>
using namespace std;
//fast io
const size_t sz = 1 << 20;
struct fastio{
char inbuf[sz];
char outbuf[sz];
fastio(){
setvbuf(stdin, inbuf, _IOFBF, sz);
setvbuf(stdout, outbuf, _IOFBF, sz);
}
}io;
//maximum tunel length
const size_t max_sz =