CF2254G Nightcrawler

题目描述

Yousef 给了你一棵有根树 $^{\ast}$,该树共有 $n$ 个结点,根为结点 $1$。每个结点 $i$ 被赋予一个整数 $a_i$。 你需要将所有 $n$ 个结点恰好划分为 $k$ 个不相交的子集 $S_1, S_2, \dots, S_k$(也就是说,每个结点必须属于且仅属于这 $k$ 个集合之一),使得下述条件被满足: - 对于任意包含两个或以上结点的子集 $S_i$,对于 $S_i$ 中任意一对结点 $u, v$,必须有一个是另一个的祖先(即它们都在从根到某个叶子的同一条路径上)。 子集 $S_i$ 的得分定义为该集合中所有结点 $u$ 的 $a_u$ 的最大值。一次划分的得分是这 $k$ 个集合得分之和。换句话说,划分的总得分为 $\sum\limits_{i=1}^{k} \max\limits_{u \in S_i} a_u$。 对于每个 $k$,$1 \leq k \leq n$,请你计算满足条件的最大划分得分。如果无法将树恰好划分为 $k$ 个满足条件的集合,输出 $-1$。 $^{\ast}$ 一棵树是一个无环连通图。有根树是指树中一个点被指定为根。 $^{\dagger}$ 结点 $v$ 的祖先为从 $v$ 到根的简单路径上的所有结点(包括根,但不包括 $v$ 本身)。根结点没有祖先。

输入格式

第一行包含一个整数 $t$($1 \leq t \leq 10^4$)——表示测试用例的组数。 每个测试用例第一行包含一个整数 $n$($3 \leq n \leq 2 \times 10^5$)——表示结点个数。 每个测试用例第二行包含 $n$ 个整数 $a_1, a_2, \dots, a_n$($1 \leq a_i \leq 10^9$)——每个结点的取值。 每个测试用例第三行包含 $n-1$ 个整数 $p_2, p_3, \dots, p_n$($1 \leq p_i < i$),其中 $p_i$ 是第 $i$ 个结点的父亲。 保证所有测试用例的 $n$ 之和不超过 $2 \times 10^5$。

输出格式

对于每个测试用例,输出一行 $n$ 个用空格隔开的整数。第 $k$ 个整数表示将树划分为 $k$ 个集合时的最大总得分。如果无法满足条件划分,输出 $-1$。

说明/提示

在第一个测试用例中: - 对于 $k=1$,所有结点必须在同一个集合。但结点 $2$ 和 $3$ 彼此不是祖先关系,因此不存在合法划分。 - 对于 $k=2$,可以选择 $S_1 = \{2\}$,$S_2 = \{1, 3\}$。本次划分得分为 $\max\limits_{u \in S_1} a_u + \max\limits_{u \in S_2} a_u = 20 + 30 = 50$,这是最大值。 - 对于 $k=3$,可以选择 $S_1 = \{1\}$,$S_2 = \{2\}$,$S_3 = \{3\}$。得分 $10 + 20 + 30 = 60$。 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF2254G/2ad2de02713d677e12a572e55b133ea74fa27bd6a47dc79e2aca6bfc05052053.png) 第一组数据对应的树结构。 在第二个测试用例中: - 对于 $k=1$,所有结点必须在同一个集合,但结点 $3$ 和 $4$ 不在同一根到叶的路径上,因此无法划分。 - 对于 $k=2$,可选 $S_1 = \{3\}$,$S_2 = \{1,2,4\}$。得分为 $\max\limits_{u \in S_1} a_u + \max\limits_{u \in S_2} a_u = 15 + 20 = 35$,这是最大值。 - 对于 $k=3$,可选 $S_1 = \{3\}$,$S_2 = \{4\}$,$S_3 = \{1,2\}$。得分为 $15 + 20 + 10 = 45$,最大。 - 对于 $k=4$,每个结点为一个集合。得分 $5 + 10 + 15 + 20 = 50$。 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF2254G/dc3dc9e4be8903c5b28924ad0150f537711dc665b38bc54a2105ad00bdb1ac4f.png) 第二组数据对应的树结构。 由 ChatGPT 5 翻译