【JZOJ 省选模拟】树

题目

Description
老虎和蒜头是好朋友。
老虎最近获得了一棵 n 个节点的树,其中 1 号点为根,第 i 条边有权 wi,连接节点 i 的父节点 pi和 i,其中 pi < i。可以注意到这棵树可以用 pi 和 wi 组成的 2n-2 个数的序列来表示。
然而,由于疏忽,老虎遗失了这棵树,他所拥有的 pi 和 wi 的序列也被打乱了,因此老虎所剩下的只有一个包含 2n-2 个数的可重集合。不过,老虎还是希望能够从这样的集合中获得一些信息,例如从节点 n 到根节点可能的最长距离是多少?这里的距离定义为从 n 到 1 的边的边权和。
这个问题对于蒜头来说太简单了。为了加大一点难度,蒜头想要知道对于所有 1 ≤ k < n,当 n 号点与 1 号点之间恰有 k 条边时,可能的最长距离的值。

Input

输入的第一行包括一个正整数 n,表示树中的节点个数。
接下来一行包括 2n-2 个数,表示老虎所拥有的集合。

Output
输出共包括一行 n-1 个数,其中的第 i 个数表示在 n 号点与 1 号点之间恰有 i 条边的可能距离的最长距离的值。如果不存在恰有 i 条边的方案,第 i 个输出的数应为-1。

Sample Input
Sample Input1
3
1 1 2 2

Sample Input2
3
2 2 2 2

Sample Input3
6
1 4 5 4 4 4 3 4 4 2

Sample Output
Sample Output1
2 3

Sample Output2
-1 -1

Sample Output3
-1 -1 -1 17 20

在样例一中,有三棵合法的树,答案是显然的。
在样例二中,显然不存在任意一棵合法的树。

Data Constraint
对于 100% 的数据,1 ≤ n ≤ 10^5,集合中的数是 [1, n) 之间的整数。
Subtask 1 (25 %): 1 ≤ n ≤ 8.
Subtask 2 (10 %): 1 ≤ n ≤ 20.
Subtask 3 (25 %): 1 ≤ n ≤ 300.
Subtask 4 (15 %): 1 ≤ n ≤ 2000.
Subtask 5 (25 %): 无特殊限制。

思路

首先将所有数排序,显然如果我们确定了一棵树,那么边权就是
此时剩下的最大的 d 个值。
对于 1 ≤ k < n,如果不超过 k 的数的个数小于 k 个,显然 2 到
k + 1 的父节点是无法分配的,不存在任意一棵满足条件的数;
如果不超过 k 的数的个数恰为 k 个,那么 2 到 k + 1 的父节点一
定恰为这 k 个数,并且 k + 1 一定出现在 n 到 1 的路径中。考虑
求出这样的每一个极小段 [l,r] 满足这一段中的父节点集合是确
定的,那么这一段中 r 到 l − 1 的路径长度会在一个区间内,并
且只有这个长度会影响答案。
显然,如果 [l,r] 中有 s 种不同的数,路径长度可以在 [1, s] 中任
意选择。这是因为我们可以通过父节点钦定从 r 到 l − 1 的任意
一条路径并使得仍然存在合法的树,否则 [l,r] 中一定包含了另
一个这样的段。
有了以上的分析,其余的部分就比较显然了。假设最后的一个极
小段是 [s,t],我们可以通过父节点钦定任意一条从 n 到 t 的路
径,由于目前没有确定的段,此时我们将剩下的最小的那些数依
次填进余下的路径中,就会得到一棵合法的树。
因此只要使用堆维护我们将哪些权值作为路径上边即可,时间复
杂度 O(n log n)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章