#loj6983. 「ICPC World Finals 2025」歪斜的推理
「ICPC World Finals 2025」歪斜的推理
[AdditionalFile6983.zip](file://AdditionalFile6983.zip?type=additional_file)
#6983. 「ICPC World Finals 2025」歪斜的推理
标签: 传统 | 时间限制: 2000 ms | 内存限制: 2048 MiB |
题目描述
以下内容基于一个真实的故事——为了保护当事人,文中的姓名均已更换……嗯,毕竟在这种故事里,你总是得这么做。
Taylor Swift 教授正在批改一份关于整数斜堆的作业。斜堆是一种二叉树,每个节点存储一个整数,并且任何节点中的值都小于或等于其任意子节点中的值。请注意,斜堆不一定是完美二叉树;也就是说,任何节点的左子树和/或右子树都可以为空。
将值 插入斜堆 的过程通过以下递归步骤完成:
- 如果 为空,则将 变成一个只包含一个节点(值为 )的斜堆。
- 否则,设 为 的根节点的值。
- 如果 ,交换根节点的两个子节点,然后将 递归地插入到新的左子树中。
- 如果 ,创建一个值为 的新节点,并将 作为这个新节点的左子树。

图 A.1:将值 插入斜堆的样例。存储 和 的节点(蓝色标记)的子节点被交换,而存储 的节点则成为新插入节点(红色标记)的左子节点。
现在,让我们回到 Swift 教授的故事。她布置的作业题目是,给定一个从 到 的数字排列,要求学生们按照给定顺序将这些数字插入一个空堆中,并给出最终形成的堆。出人意料的是,有些学生给出了错误的答案!这让 Swift 教授开始思考:对于一个给定的堆,是否存在一个输入排列能够生成这个堆?如果存在,那么字典序最小和最大的输入排列分别是什么?
输入格式
输入的第一行包含一个整数 ,表示树中的节点数量。这些节点恰好包含从 到 的数字。接下来是 行,第 行包含两个整数 和 ( 或 ; 或 ),描述了存储值为 的节点的左、右子节点的值。值为 表示对应的子节点不存在。保证这些数据描述的是一棵二叉树。
输出格式
输出能够通过斜堆插入方法生成给定树的、字典序最小的输入排列,以及字典序最大的输入排列。这两个排列可能相同,此时仍需将它们都输出。如果不存在能够生成给定树的输入排列,则输出 impossible。
样例 1
输入
7
2 3
4 5
6 7
0 0
0 0
0 0
0 0
输出
1 3 2 7 5 6 4
7 1 5 3 2 6 4
样例 2
输入
2
0 2
0 0
输出
impossible
样例 3
输入
3
2 0
3 0
0 0
输出
2 3 1
3 2 1