【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)。

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