题解 #:
这道题需要的是字典序最大那么显然可以知道对于一个点i它后面的最大点可以直接获取,然后将i赋值为那个点坐标,如果后面最大都不如i-1大那么就往前找i=i-1;
#include<bits/stdc++.h>
using namespace std;
int a[200005];
int vis[200005];
bool out[200005];
queue<int>ans;
int n;
int read(){
int num=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
num=(num<<1)+(num<<3)+ch-'0';
ch=getchar();
}
return num*f;
}
int main(){
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
int maxn=n;
for(int i=1;i<=n;i++){
vis[a[i]]=i;
while(out[maxn]) maxn--;
int x=maxn;
while(vis[x]) x--;
for(int j=i;j;j--){
if(out[a[j]]) continue;
if(a[j]>x){ //向前找
out[a[j]]=1;
ans.push(a[j]);
}
else break;
}
}
for(int i=n;i;i--){
if(!out[a[i]]) ans.push(a[i]);
}
while(ans.size()){
if(ans.size()>1)
cout<<ans.front()<<" ";
else cout<<ans.front();
ans.pop();
}
return 0;
}