QOJ.ac

QOJ

Time Limit: 2.0 s Memory Limit: 256 MB Total points: 100 Hackable ✓

#7103. 红黑树

Statistics

BaoBao 在他的后院发现了一棵有 $n$ 个顶点的有根树,边上有权重。在这些顶点中,有 $m$ 个是红色的,其余是黑色的。树的根是顶点 1,且它是一个红色顶点。

我们定义红色顶点的代价为 0,黑色顶点的代价为该顶点到其最近的红色祖先的距离。

回想一下: 树上路径的长度是该路径上所有边的权重之和。 两个顶点之间的距离是树上从一个顶点到另一个顶点的最短路径长度。 * 如果顶点 $u$ 位于顶点 $v$ 到树根(本题中为顶点 1)的最短路径上,则称 $u$ 是 $v$ 的祖先。

由于 BaoBao 很无聊,他决定在这棵树上进行 $q$ 场游戏。对于第 $i$ 场游戏,BaoBao 将在树上选择 $k_i$ 个顶点 $v_{i,1}, v_{i,2}, \dots, v_{i,k_i}$,并尝试通过将树上至多一个顶点变为红色,来最小化这 $k_i$ 个顶点的最大代价。

注意: BaoBao 可以自由地将树上 $n$ 个顶点中的任意一个变为红色,而不一定非要是他试图最小化最大代价的那 $k_i$ 个顶点中的一个。 所有的 $q$ 场游戏都是独立的。也就是说,BaoBao 在每场游戏中使用的树始终是初始给定的树,而不是上一场游戏中通过改变至多一个顶点而修改过的树。

请帮助 BaoBao 计算在每场游戏中,通过将至多一个顶点变为红色后,给定 $k_i$ 个顶点的最小可能最大代价。

输入格式

输入包含多组测试数据。第一行包含一个整数 $T$,表示测试数据的组数。对于每组测试数据:

第一行包含三个整数 $n, m$ 和 $q$ ($2 \le m \le n \le 10^5, 1 \le q \le 2 \times 10^5$),分别表示树的大小、红色顶点的数量和游戏的场数。

第二行包含 $m$ 个整数 $r_1, r_2, \dots, r_m$ ($1 = r_1 < r_2 < \dots < r_m \le n$),表示红色顶点。

接下来的 $(n - 1)$ 行,每行包含三个整数 $u_i, v_i$ 和 $w_i$ ($1 \le u_i, v_i \le n, 1 \le w_i \le 10^9$),表示树中连接顶点 $u_i$ 和 $v_i$ 的一条权重为 $w_i$ 的边。

接下来的 $q$ 行,第 $i$ 行首先包含一个整数 $k_i$ ($1 \le k_i \le n$)。随后是 $k_i$ 个整数 $v_{i,1}, v_{i,2}, \dots, v_{i,k_i}$ ($1 \le v_{i,1} < v_{i,2} < \dots < v_{i,k_i} \le n$),表示 BaoBao 需要最小化其最大代价的顶点。

保证所有测试数据中 $n$ 的总和不超过 $10^6$,且所有测试数据中 $k_i$ 的总和不超过 $2 \times 10^6$。

输出格式

对于每组测试数据,输出 $q$ 行,每行包含一个整数,表示在每场游戏中将树上至多一个顶点变为红色后,给定 $k_i$ 个顶点的最小可能最大代价。

样例

样例输入 1

2
12 2 4
1 9
1 2 1
2 3 4
3 4 3
3 5 2
2 6 2
6 7 1
6 8 2
2 9 5
9 10 2
9 11 3
1 12 10
3 3 7 8
4 4 5 7 8
4 7 8 10 11
3 4 5 12
3 2 3
1 2
1 2 1
1 3 1
1 1
2 1 2
3 1 2 3

样例输出 1

4
5
3
8
0
0
0

说明

第一个样例测试数据如上图所示。记 $C(v)$ 为顶点 $v$ 的代价。

对于第 1 场游戏,最佳选择是将顶点 2 变为红色,使得 $C(3) = 4, C(7) = 3$ 且 $C(8) = 4$。因此答案为 4。

对于第 2 场游戏,最佳选择是将顶点 3 变为红色,使得 $C(4) = 3, C(5) = 2, C(7) = 4$ 且 $C(8) = 5$。因此答案为 5。

对于第 3 场游戏,最佳选择是将顶点 6 变为红色,使得 $C(7) = 1, C(8) = 2, C(10) = 2$ 且 $C(11) = 3$。因此答案为 3。

对于第 4 场游戏,最佳选择是将顶点 12 变为红色,使得 $C(4) = 8, C(5) = 7$ 且 $C(12) = 0$。因此答案为 8。

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
#290EditorialOpen题解jiangly2025-12-14 06:53:46View

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.