#P12652. [KOI 2024 Round 2] 拔树游戏

[KOI 2024 Round 2] 拔树游戏

题目背景

试题来源:https://koi.or.kr/archives/。中文翻译做了少量本土化修改。

按照署名—非商业性使用—相同方式共享 4.0 协议国际版进行授权。

题目描述

有一棵由编号为 11NNNN 个节点构成的有根树。该树的根节点为 11 号节点,并且第 ii 号节点的父节点是第 PiP_i 号节点(2iN2 \le i \le N)。此外,每个节点都有一个互不相同的整数权值,第 ii 号节点的权值为 AiA_i1iN1 \le i \le N)。

不含子节点的节点称为叶子节点。

我们从根节点(即 11 号节点)出发,每次移动到当前节点的子节点中权值最小的一个。如此重复,直到到达某个叶子节点。这样得到的从 11 号节点出发、以某个叶子节点结束的路径,记作 S={S1,S2,,Sk}S = \{S_1, S_2, \ldots, S_k\},我们称其为特殊路径

定义拔除操作如下:

  • 设当前树的特殊路径为 S={S1,S2,,Sk}S = \{S_1, S_2, \ldots, S_k\}
  • S1S_1S2S_2 的权值交换。
  • S2S_2S3S_3 的权值交换。
  • 依此类推……
  • Sk1S_{k-1}SkS_k 的权值交换。
  • 从树中移除连接 SkS_k 与其父节点之间的边。

换句话说,拔除操作会将特殊路径上的节点的权值依次向后传递,并将该路径最后一个叶子节点从树中删除。

例如,考虑下图中的树(图中圆圈外的数字表示节点编号,圆圈内的数字表示该节点的权值):

在第一棵树中,特殊路径为 S={1,3,4}S = \{1, 3, 4\}:从根节点 11 出发,子节点中权值最小的是 33 号节点,再从 33 出发,选择子节点中权值最小的 4444 是叶子节点,结束路径。
进行拔除操作后,依次交换权值 A1A3A_1 \leftrightarrow A_3A3A4A_3 \leftrightarrow A_4,并删除 4433 之间的边,得到第二棵树。

在第二棵树中,特殊路径为 S={1,2}S = \{1, 2\}11 的子节点中权值最小的是 2222 是叶子节点。进行拔除操作,交换 A1A2A_1 \leftrightarrow A_2,删除 2211 的边,得到第三棵树。

在第三棵树中,特殊路径为 S={1,3,5}S = \{1, 3, 5\}。拔除操作为交换 A1A3A_1 \leftrightarrow A_3A3A5A_3 \leftrightarrow A_5,然后删除 5533 之间的边,得到第四棵树。

在第四棵树中,特殊路径为 S={1,3}S = \{1, 3\}。执行拔除操作后交换 A1A3A_1 \leftrightarrow A_3,再删除 3311 的边,得到第五棵树。

在第五棵树中,特殊路径仅为 S={1}S = \{1\}。执行拔除操作后,直接删除根节点 11

我们将对给定的树重复执行 NN 次拔除操作。请你编写一个程序,在每次拔除操作执行之前,输出当前 11 号节点的权值。

输入格式

第一行输入一个整数 NN,表示节点个数。
第二行输入 N1N-1 个整数 P2,P3,,PNP_2, P_3, \ldots, P_N,表示每个节点的父节点编号,数字之间以空格分隔。
第三行输入 NN 个整数 A1,A2,,ANA_1, A_2, \ldots, A_N,表示每个节点的初始权值,数字之间以空格分隔。

输出格式

输出共 NN 行,每行一个整数,第 ii 行表示执行第 ii 次拔除操作之前11 号节点的权值。

5
1 1 3 3
5 2 1 3 4
5
1
2
3
4

提示

约束条件

  • 所有给定数值均为整数。
  • 2N3000002 \le N \le 300\,000
  • 1Pi<i(2iN)1 \le P_i < i \quad (2 \le i \le N)
  • 1AiN(1iN)1 \le A_i \le N \quad (1 \le i \le N)
  • 所有 AiA_i 两两不同。

子任务

  1. (6 分)N3000N \le 3\,000
  2. (10 分)对所有 2iN2 \le i \le N,有 APi<AiA_{P_i} < A_i
  3. (11 分)对所有 2iN2 \le i \le N,有 APi>AiA_{P_i} > A_i
  4. (23 分)度数大于等于 33 的节点个数不超过 2020
  5. (50 分)无额外限制

翻译由 ChatGPT-4o 完成