CF901A Hashing Trees

题目描述

Sasha 参加了一场编程比赛。在其中一道题目中,她需要判断一些有根树是否同构。她此前没有见过这种题目,但作为一位经验丰富的选手,她猜测需要将树转换为某种序列,然后将这些序列进行比较,而不是直接比较树。Sasha 想要将每棵树与一个序列 $a_0, a_1, ..., a_h$ 匹配,其中 $h$ 是树的高度,$a_i$ 表示距离根节点 $i$ 条边的顶点数。 不幸的是,这次 Sasha 的直觉是错误的,因为可能存在多棵树对应相同的序列。为了证明这一点,你需要编写一个程序,对于给定的序列 $a_i$,构造出两棵不同构的有根树且都满足该序列,或者判断只有一种这样的树。 两棵有根树是同构的,当且仅当可以重新编号第一棵树的顶点,使得根节点的编号与第二棵树的根节点编号相同,且这两棵树结构完全一致。 有根树的高度定义为:从根节点到任意其他顶点的最长路径所经过的边数。

输入格式

第一行包含一个整数 $h$($2 \leq h \leq 10^5$),表示树的高度。 第二行包含 $h+1$ 个整数,依次为序列 $a_0, a_1, ..., a_h$($1 \leq a_i \leq 2 \cdot 10^5$)。所有 $a_i$ 的和不超过 $2 \cdot 10^5$。保证至少存在一棵树满足该序列。

输出格式

如果只有一种树满足该序列,输出 `perfect`。 否则,第一行输出 `ambiguous`。第二行和第三行分别输出两棵树的描述:每行输出 $k$ 个整数,第 $k$ 个整数为顶点 $k$ 的父节点编号,若顶点 $k$ 为根节点则输出 $0$。 这两棵树应当不同构,并且都满足给定的序列。

说明/提示

第一个示例中只有一种树;第二个示例中给出的两棵树详见下图: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF901A/b36c39150954d88fe8a1ed6f96a05d8a24b743af.png) 由 ChatGPT 5 翻译