题目
http://codeforces.com/contest/902/problem/C
分析
只要满足两个条件,即存在同构树: ①该节点上一层的节点数大于1, ②该节点所在层节点个数大于1。
以例2中的{1,2,2}为例:
只要将最后一个节点(即节点5),放到上一层的倒数第二个节点(即结点2)下,就形成了两棵同构树。
代码
#include<bits/stdc++.h>
using namespace std;
const int N =
200001;
int main()
{
int height;
int cnt[N];
int parent =
0;
bool flag =
1;
cin >> height;
for(
int layer =
0; layer <= height; layer++)
{
cin >> cnt[layer];
if(layer ==
0)
{
continue;
}
if(cnt[layer -
1] !=
1 && cnt[layer] !=
1)
{
flag =
0;
}
}
if(flag)
{
puts(
"perfect");
return 0;
}
puts(
"ambiguous");
for(
int layer =
0; layer <= height; layer++)
{
for(
int node =
1; node <= cnt[layer]; node++)
{
cout << parent <<
" ";
}
parent += cnt[layer];
}
printf(
"\n");
parent =
0;
for(
int layer =
0; layer <= height; layer++)
{
if(layer !=
0 && cnt[layer -
1] !=
1 && cnt[layer] !=
1)
{
for(
int node =
1; node <= cnt[layer] -
1; node++)
{
cout << parent <<
" ";
}
cout << parent -
1 <<
" ";
parent += cnt[layer];
continue;
}
for(
int node =
1; node <= cnt[layer]; node++)
{
cout << parent <<
" ";
}
parent += cnt[layer];
}
return 0;
}
更多内容请关注微信公众号