CF901 A. Hashing Trees(构造)

3 篇文章 0 订阅

A. Hashing Trees
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Sasha is taking part in a programming competition. In one of the problems she should check if some rooted trees are isomorphic or not. She has never seen this problem before, but, being an experienced participant, she guessed that she should match trees to some sequences and then compare these sequences instead of trees. Sasha wants to match each tree with a sequence a0, a1, …, ah, where h is the height of the tree, and ai equals to the number of vertices that are at distance of i edges from root.

Unfortunately, this time Sasha’s intuition was wrong, and there could be several trees matching the same sequence. To show it, you need to write a program that, given the sequence ai, builds two non-isomorphic rooted trees that match that sequence, or determines that there is only one such tree.

Two rooted trees are isomorphic, if you can reenumerate the vertices of the first one in such a way, that the index of the root becomes equal the index of the root of the second tree, and these two trees become equal.

The height of a rooted tree is the maximum number of edges on a path from the root to any other vertex.

Input
The first line contains a single integer h (2 ≤ h ≤ 105) — the height of the tree.

The second line contains h + 1 integers — the sequence a0, a1, …, ah (1 ≤ ai ≤ 2·105). The sum of all ai does not exceed 2·105. It is guaranteed that there is at least one tree matching this sequence.

Output
If there is only one tree matching this sequence, print “perfect”.

Otherwise print “ambiguous” in the first line. In the second and in the third line print descriptions of two trees in the following format: in one line print integers, the k-th of them should be the parent of vertex k or be equal to zero, if the k-th vertex is the root.

These treese should be non-isomorphic and should match the given sequence.

Examples
inputCopy
2
1 1 1
outputCopy
perfect
inputCopy
2
1 2 2
outputCopy
ambiguous
0 1 1 3 3
0 1 1 3 2
Note
The only tree in the first example and the two printed trees from the second example are shown on the picture:

题意:给你一个数组a,ai代表树的第i深度的节点数,现在问你存不存在每层节点数相同,但是不同构的树,如果存在输出ambiguous,接下来输出两颗树,否则输出perfect

思路:同构就是两棵树,如果每层节点的度数一样,那么它就是同构的,所以可以得出结论,如果连续两层节点数大于1的话,那么就存在两颗不同构的树
同构可以看下面这篇文章
树的同构

代码:

#include<bits/stdc++.h>
#define LL long long
#define Max 100005
const LL mod=1e9+7;
const LL LL_MAX=9223372036854775807;
using namespace std;
int a[Max],n;
int b[2*Max],c[2*Max];
int main()
{
    scanf("%d",&n);
    int flag=0,index;
    for(int i=1;i<=n+1;i++){
        scanf("%d",&a[i]);
        if(a[i]>1 && a[i-1]>1){
            flag=1;
            index=i;
        }
    }
    if(!flag){
        printf("perfect\n");
    }
    else{
        printf("ambiguous\n");
        int t=0,len=0;
        for(int i=1;i<=n+1;i++){
            for(int j=0;j<a[i];j++){
                b[len]=t;
                c[len++]=t;
                if(i==index && j==a[i]-1){
                    c[len-1]=b[len-1]-1;
                }
            }
            t+=a[i];
        }
        for(int i=0;i<len;i++)
            printf("%d ",b[i]);
        printf("\n");
        for(int i=0;i<len;i++)
            printf("%d ",c[i]);
        printf("\n");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值