较为简单。小于大于的都走一遍就可以AC了
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 1010 #define MAX (1<<30)-1 #define V vector<int> using namespace std; int pre[LEN]; vector<int> post; bool isMirror=0; int n; void set_post(int a,int b){ if(a>b)return; if(a!=b){ int i=a+1; if(isMirror) while(i<=b && pre[i]>=pre[a]) i++; else while(i<=b && pre[i]<pre[a]) i++; int j=i; if(isMirror) while(j<=b && pre[j]<pre[a]) j++; else while(j<=b && pre[j]>=pre[a]) j++; set_post(a+1,i-1); set_post(i,j-1); } post.push_back(pre[a]); } int main(){ // freopen("1043_3.txt","r",stdin); I("%d",&n); int i; FF(i,n) I("%d",&pre[i]); set_post(0,n-1); bool isOK=1; if(post.size()!=n){ post.clear(); isMirror=1; set_post(0,n-1); if(post.size()!=n) isOK=0; } if(isOK){ puts("YES"); FF(i,n){ O("%d",post[i]); if(i!=n-1) O(" "); } }else puts("NO"); return 0; }