1 条题解
-
0
此题略有难度(只使用栈的情况下,实际上有别的STL可以较方便的解决此题)。
给每个入库的集装箱分配一个id,维护两个栈,第一个栈存栈内集装箱的id,第二个栈存最大值的id,即第二个栈从栈底到栈顶是严格递增的。
每次新入库一个集装箱,就看一下它是否比第二个栈的栈顶值还大,如果更大就也push进第二个栈。
出库的时候记录一下出库的id,标记为已出库。
查询的时候检查一下第二个栈的栈顶是否已经出库了,用while循环检查并弹出即可。
#include<bits/stdc++.h> using namespace std; int a[200005],vis[200005],n,id; stack<int> save,maxn; int main() { cin>>n; while(n--){ int opt;cin>>opt; if(opt==0){ int x;cin>>x; a[++id]=x; save.push(id); while(maxn.size()&&vis[maxn.top()])maxn.pop(); if(maxn.size()&&a[maxn.top()]<x)maxn.push(id); else if(maxn.empty())maxn.push(id); } if(opt==1){ if(save.size())vis[save.top()]=1,save.pop(); } if(opt==2){ while(maxn.size()&&vis[maxn.top()])maxn.pop(); if(maxn.empty())cout<<0<<'\n'; else cout<<a[maxn.top()]<<'\n'; } } return 0; }
- 1
信息
- ID
- 165
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 61
- 已通过
- 17
- 上传者
京公网安备 11011102002149号