#HK4960. 「EGOI2024」团队编程

「EGOI2024」团队编程

题目描述

题目译自 European Girls' Olympiad in Informatics 2024 Day1 T3. Team Coding

在埃因霍温巨型开源研究所(Eindhoven Gigantic Open-Source Institute, EGOI),公司结构极为等级分明。除了首席执行官安妮克外,其余 N1N-1 名员工每人都有一个唯一的直接上司,且公司层级中不存在循环。你可以把公司层级想象成一棵以安妮克为根的树。作为一家多元化的公司,员工使用 KK 种不同的编程语言,每位员工有且只有一种偏好的编程语言。

安妮克为公司的一个团队安排了一个大型新项目,她希望投入尽可能多的资源。为此,你需要帮助她按照以下步骤组建团队:

  1. 选择一名员工作为团队负责人。这也将决定项目的编程语言。负责人子树中所有偏好相同编程语言的员工将加入项目。
  2. 通过交换员工,增加参与项目的员工数量,交换的对象是偏好与负责人相同编程语言的员工。

为了最大化参与项目的员工数量,你可以任意多次执行以下交换操作:

  1. 选择两名员工:
    • 一名员工当前在负责人的子树中,且偏好的编程语言与负责人不同。
    • 另一名员工不在该子树中,且偏好与负责人相同的编程语言。此外,这两名员工必须处于同一层级,即他们在通向安妮克的汇报链中有相同数量的上级。在公司层级树中,他们位于树的同一层。
  2. 这两名员工(仅限他们,不包括其他员工)在公司层级中交换位置。注意,汇报给这两名员工的下属保持原位,仅变更他们的直接上司。

例如,在下图中,若选择员工 44 为负责人,你可以交换员工 3322,但不能交换员工 1188

swap.png

你的任务是找出参与新项目的最大员工数量,以及实现这一目标所需的最少交换次数。

输入格式

第一行包含两个整数 N,KN, K,分别表示 EGOI 的员工数量和可能使用的编程语言数量。

员工编号从 00N1N-1,安妮克(首席执行官)为 00 号。下一行包含 NN 个整数 i\ell_i (0i<K)(0 \leq \ell_i < K),表示员工偏好的编程语言。

接下来的 N1N-1 行描述公司结构。第 ii 行包含一个整数 bib_i (0bi<N)(0 \leq b_i < N),表示第 ii 名员工的直接上司。注意,ii11NN,因为安妮克没有上司。

输出格式

输出一行,包含两个整数 P,SP, S,分别表示通过任意次数交换可达到的参与新项目的最大员工数量(包括负责人)以及实现此目标所需的最少交换次数。

5 3
0 1 2 2 1
0
1
2
3

2 0

前两个样例的公司结构如下图所示,其中图案表示编程语言(00 = “条纹”,11 = “点状”,22 = “纯色”):

kattis_e1e2.png

在第一个样例中,选择员工 11 作为负责人,员工 44 偏好相同的编程语言,没有可行的交换来增加人数。

4 2
0 1 0 0
0
0
1

3 0

在第二个样例中,公司有 33 名员工偏好语言 00,这也是安妮克偏好的语言,因此选择安妮克为负责人可组成 33 人的团队,无需交换。

9 3
0 0 2 1 2 0 2 1 2
4
8
1
0
4
1
0
7

4 2

kattis_e3e4.png

在第三个样例中,选择员工 44 为负责人,然后让员工 11882233 交换团队,可得到 44 名偏好与 44 相同语言(22,黄色/纯色)的员工。

8 3
0 2 1 2 2 1 1 1
6
3
0
6
3
0
3

3 2

在第四个样例中,选择员工 66 为负责人,并交换员工 44771155,可获得最大人数。注意,在选择负责人前不能交换员工 6633 以得到 44 人的团队,因为必须先确定负责人。

数据范围与提示

对于所有输入数据,满足:

  • 1N1051 \leq N \leq 10^5
  • 1KN1 \leq K \leq N

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 1212 对于所有 1i<N1 \leq i < N,员工 ii 的直接上司是 i1i-1
22 1919 K2K \leq 2
33 2727 每种编程语言最多有 1010 名员工偏好
44 2323 N2000N \leq 2000
55 1919 无附加限制