一开始想用一个堆来维护最大值,不仅调了半天而且还会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; }