YbtOj练习:贪心3 出栈序列

一开始想用一个堆来维护最大值,不仅调了半天而且还会TLE。。。

最后发现只要预处理最大值即可。

对于任何时刻的栈顶,只要尚未入栈的数当中没有比它大的,那么它就是最优的,否则需要继续入栈。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5,inf=0x3f3f3f3f;
int n,a[N],output[N],cnt,maxa[N],top,Stack[N];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    int maxd=0;
    for(int i=n;i;i--)
    {maxd=max(maxd,a[i]);
        maxa[i]=maxd;
        
    }
//    cout<<"MAXN: "<<maxa[10]<<endl;
    Stack[++top]=a[1];
    int now=2;
    while(top)
    {
    //    printf("%d %d
",Stack[top],a[now]);
        while(top&&Stack[top]>maxa[now]) //能写while的地方尽量不要写if
        output[++cnt]=Stack[top--];
        if(now<=n) Stack[++top]=a[now++];
        //if(Stack[top]==8) cout<<now<<endl;
    }
    for(int i=1;i<=cnt;i++) printf("%d ",output[i]);
    return 0;
}
原文地址:https://www.cnblogs.com/smartljy/p/13431672.html