题目描述
某仓库购入新的货物(每次购入的货物均不同)并将一部分老货物发出,这个过程会有软件对数据以日志形式保存,规则如下:
该日志记录了两类操作:第一类操作为入库操作,以及该次入库的货物数量;第二类操作为出库操作。这些记录都严格按时间顺序排列。入库和出库的规则为先进后出,即每次出库操作货物为当前在仓库里所有货物中最晚入库的货物。
为了便于分析,现在加入了第三类查询操作,每次查询时,输出当前仓库数量最多的货物的数量。
输入
包含 N+1N+1 行:
第一行为 11 个正整数 NN,对应于日志内所含操作的总数。
接下来的 NN 行,分别属于以下三种格式之一:
格式 1: 0 X //一次入库操作,正整数 XX 表示该次入库的货物的数量
格式 2: 1 //一次出库操作,(就当时而言)最后入库的货物出库
格式 3: 2 //一次查询操作,要求分析程序输出当前仓库内数量最多的货物的数量
当仓库为空时你应该忽略出库操作,当仓库为空查询时你应该输出 00。
初始时仓库状态为空。
输出
输出行数等于日志中查询操作的次数。每行为一个正整数,表示查询结果。
样例输入
13
0 1
0 2
2
0 4
0 2
2
1
2
1
1
2
1
2
样例输出
2
4
4
1
0
数据规模与约定
时间限制:1 s
内存限制:256 M
100% 的数据保证 N≤200000,X≤108
思路:一个栈模拟入库出库,另一个栈保存最值,新入库货物数量比栈顶大就入库,否则不入,维护栈顶为最大值,出库时判断最大值是否掉。
#include <iostream>
#include <algorithm>
#include <stack>
#include <cstdio>
using namespace std;
stack<int> a;
stack<int> b;
int main(){
int n;cin>>n;
int top=0;
while(n--){
int op;cin>>op;
if(op==0){
int t;cin>>t;
a.push(t);
if(b.empty()){
b.push(t);
}else if(b.top() <= t){
b.push(t);
}
}else if(op==1){
int t;
if(!a.empty()){
t=a.top();
a.pop();
}
if(!b.empty() && t == b.top()){
b.pop();
}
}else if(op==2){
if(b.empty())cout<<0<<endl;
else cout<< b.top() <<endl;
}
}
return 0;
}