1 条题解

  • 0
    @ 2025-12-3 11:25:08

    此题略有难度(只使用栈的情况下,实际上有别的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
    上传者