#include<bits/stdc++.h>
using namespace std;
int n;
int flag=0;
vector<int> qx;
vector<int> hx;
void judge(int start , int end)//start是根的位置(先序)
{
int i,j;
i=start+1;
j=end;
if(flag)
{
while(i<=end&&qx[start]>qx[i]) i++;
while(j>start&&qx[start]<=qx[j]) j--;
}
else{
while(i<=end&&qx[start]<=qx[i]) i++;
while(j>start&&qx[start]>qx[j]) j--;
}
if(i-j!=1)
return ;
judge(start+1,j);//zuo
judge(i,end);
hx.push_back(qx[start]);
}
int main()
{
int i,j;
scanf("%d",&n);
qx.resize(n);
for(i=0;i<n;i++)
{
scanf("%d",&qx[i]);
}
judge(0,n-1);
if(hx.size()!=n)
{
flag=1;
hx.clear();
judge(0,n-1);
}
if(hx.size()==n)
{
printf("YES\n%d",hx[0]);
for(i=1;i<n;i++)
printf(" %d",hx[i]);
}
else
printf("NO");
return 0;
}
对着图走一遍,就明白了。