特殊同构树,,
根据规则,相邻的两层结点 同时大于一个结点就会有差异,
输出方案的时候 一种是把所有的结点放到上一层的一个结点上,,另一种是把一个拿出来放到上层的一个结点上,另外的放到上层的另外的结点上
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<queue>
#include<stack>
#include<map>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
#define kuaidian ios::sync_with_stdio(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + 777, maxd = 1e8;
const ll mod = 1e9 + 7;
const int INF = 0x7f7f7f7f;
int n;
int a[maxn];
int main() {
kuaidian;
cin >> n; n++;
int f = 0;
for(int i = 1; i <= n; ++i) cin >> a[i];
for(int i = 2; i <= n; ++i) {
if(a[i-1] > 1 && a[i] > 1) {
f = 1;
break;
}
}
if(!f) {
cout << "perfect" << endl;
return 0;
}
else {
cout << "ambiguous" << endl;
int id = 1;
cout << 0;
for(int i = 2; i <= n; ++i) {
for(int j = 0; j < a[i]; ++j) {
cout << " " << id;
}
id += a[i];
}
cout << endl;
id = 1;
cout << 0;
for(int i = 2; i <= n; ++i) {
if(a[i-1] > 1 && a[i] > 1) {
cout << " " << id-1;
for(int j = 1; j < a[i]; ++j) {
cout << " " << id;
}
id += a[i];
}
else {
for(int j = 0; j < a[i]; ++j) {
cout << " " << id;
}
id += a[i];
}
}
cout << endl;
}
return 0;
}