2 solutions

  • 1
    @ 2026-8-5 15:09:33

    注释版,易理解

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    int s[N],t;   // s[]模拟栈,t为栈顶指针,t=0代表栈空
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(nullptr);  // 输入输出加速,处理1e5大数据
        int n;
        cin>>n;
        // 依次遍历每一个数字
        for(int i=1;i<=n;i++){
            int x;
            cin>>x;
            // 单调栈核心:栈不为空,且栈顶元素 >= 当前x,直接弹出
            // 因为栈顶元素比x大,它不可能成为后面元素的"左边更小值",直接舍弃
            while(t&&s[t]>=x){
                t--;
            }
            // 栈不为空:栈顶就是左边第一个比x小的数
            if(t){
                cout<<s[t]<<" ";
            }
            // 栈空:左边没有比x小的数字,输出-1
            else{
                cout<<"-1 ";
            }
            // 将当前x压入栈,供后面的数字查询使用
            s[++t]=x;
        }
        return 0;
    }
    

    精简版,可以直接使用

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    int s[N],t;
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n,cin>>n;
        for(int i=1;i<=n;i++){
            int x;
            cin>>x;
            while(t&&s[t]>=x) t--;
            if(t) cout<<s[t]<<" ";
            else cout<<"-1 ";
            s[++t]=x;
        }
        return 0;
    }
    

    Information

    ID
    334
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    # Submissions
    12
    Accepted
    7
    Uploaded By