1 solutions

  • 1
    @ 2025-5-22 22:25:58

    都知道这是单调栈的模板题,来说说单调栈

    比如咱zx信奥队,新初一加入了,老师有一个

    测试,分数比新来的要低的就踢出去

    (纯打比方,咱zx没有这么残酷(~ ̄▽ ̄)~)

    那么每一次有新来的,就比较栈里面的人有哪

    些分数比他低,踢出去

    因为每一次只会留下比新来的更强的,

    所以可以证明栈内元素单调递增

    看代码吧:

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int a[3000005]={};
    stack<int> s;//存下标 
    int p[3000005]={};//存答案倒序输出 
    signed main(){
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>a[i];
    	for(int i=n;i>=1;i--){//反着来,逐渐压入 
    		while(!s.empty()&&a[s.top()]<=a[i]) s.pop();
    		//队头的人比新来的弱就踢掉 
    		if(s.empty()) p[i]=0;//一定要判断不然RE 
    		else p[i]=s.top();
    		s.push(i);//新来的入栈 
    	}
    	for(int i=1;i<=n;i++) cout<<((p[i]<=n)?p[i]:0)<<' ';//最后判断一次以防万一 
    	return 0;
    }
    
    • 1

    Information

    ID
    363
    Time
    1000ms
    Memory
    125MiB
    Difficulty
    9
    Tags
    # Submissions
    11
    Accepted
    4
    Uploaded By