#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,p[300002],wei[300001],sum;
bool flag[300002];
vector<int> ans;
void jian(int i){
sum=wei[i]-1;
while(sum!=0&&p[sum]>p[sum+1]&&flag[sum]==false){
flag[sum]=true;
ans.push_back(p[sum]);
sum--;
}
}
void jia(int i){
sum=wei[i]+1;
while(sum<=n&&p[sum-1]<p[sum]&&flag[sum]==false){
flag[sum]=true;
ans.push_back(p[sum]);
sum++;
}
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>p[i];
wei[p[i]]=i;
}
flag[0]=flag[n+1]=true;
for(int i=1;i<=n;i++){
if(flag[wei[i]]==true) continue;
ans.push_back(i);flag[wei[i]]=true;
if(flag[wei[i]-1]==false&&flag[wei[i]-1]==false){
if(p[wei[i]-1]>p[wei[i]+1]) jian(i);
else jia(i);
}
else if(flag[wei[i]-1]==false) jian(i);
else if(flag[wei[i]+1]==false) jia(i);
}
for(int i=0;i<ans.size();i++){
cout<<ans[i]<<" ";
}
}
Subs #3,5全错了。
但是我这里有没有特判,为什么不是一错全错?
思路也是一样,就是对于每个数 pi, 看他左右2数,哪个数大,就朝着哪边伸展最长上升子序列。
但是n一但大就错了,也不知道为什么。