一个简单的贪心做法(已通过@7QQQQQQQ大佬的hack数据)

我们设maxe[i]表示i-n的元素的最大值。

那么,我们假设,当前栈顶的元素比maxe[i+1]大(最近入栈的是第i个元素),那么,不难发现,如果我们当前元素不出栈的话,之后如果有元素入栈,那么最后出栈的字典序一定会小于当前元素出栈的字典序。于是按照这个策略模拟即可~

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+2;
int a[N],maxe[N],sta[N],top;
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
    }
    for(int i=n;i;--i){
        maxe[i]=max(maxe[i+1],a[i]);
    }
    for(int i=1;i<=n;++i){
        sta[++top]=a[i];
        while(top&&sta[top]>maxe[i+1]){//因为maxe[n+1]=0,所以最后一定会把栈弹空
            printf("%d ",sta[top--]);
        }
    }
    return 0;
}