DTOJ 樹的解構

abigben發表於2020-11-26

題目

Mivik 喜歡 Eprom 的解構俱樂部,於是他想解構一棵樹。

Mivik 找到了一棵以 1 1 1 為根的有 n n n 個結點的有根外向樹。Mivik 會進行 ( n − 1 ) (n − 1) (n1) 次操作,每次 Mivik 都會從未刪掉的邊中等概率選擇一條邊將其刪去。記這條邊為 a → b a → b ab,則刪去這條邊的代價是刪邊時 b b b 的子樹大小(包括 b b b 自己);刪去這條邊後 b b b 為根的子樹會形成一棵新的以 b b b 為根的有根樹。

例如,下圖是 Mivik 找到的有根樹:

如果 Mivik 選了 1 → 2 1 \to 2 12 這條邊並將其刪去,那麼代價是 3 3 3 2 2 2 所在的子樹內共有 2 , 4 , 5 2,4,5 2,4,5 三個結點),而後情況會變成這樣:

如果 Mivik 此時再刪去 2 → 4 2 \to 4 24 這條邊,那麼代價是 1 1 1 4 4 4 所在的子樹內只有 4 4 4 一個結點),
隨後情況會變成這樣:

Mivik 想知道,他進行這 ( n − 1 ) (n − 1) (n1) 次操作後期望的代價總和是多少。由於 Mivik 不喜歡太大的數,你只需要輸出期望的值對 1 0 9 + 7 10^9 + 7 109+7 取模的結果。

資料範圍

對於所有測試點,滿足 1 ≤ n ≤ 2 × 1 0 6 1 \leq n \leq 2 \times 10^6 1n2×106。保證給出的有根樹合法。
每個子任務的具體限制見下表:

子任務編號分值特殊限制
1 1 1 10 10 10 a i = 1 a_i=1 ai=1
2 2 2 15 15 15 a i = i a_i=i ai=i
3 3 3 25 25 25 n ≤ 500 n \leq 500 n500
4 4 4 50 50 50

題解

想到對於從 1 1 1 i i i 的一條鏈上的答案是互不影響的,所以我們對於一個點 i i i 考慮其對答案的貢獻。
顯然, 設 S i = a 1 , a 2 … , a i S_i=a_1,a_2 \dots,a_i Si=a1,a2,ai 為邊的數量為 i i i 的 刪邊順序的排列(這裡的 a i a_i ai是按照從根到 i i i 的邊的順序來排的,即 a i = k a_i=k ai=k, k k k為第 k k k條邊)。我們只要統計其中的有效刪邊(會把 i i i計算進去的刪邊)的邊數即為答案。
顯然,如果 a i > a j , i < j , a_i>a_j,i<j, ai>aj,i<j那麼 i i i 就不會被計算到。於是 S S S 的答案即為排列中單調棧的大小。
然後我們考慮怎麼求其單調棧的大小:
對於一個數 x x x,顯然,只有 1 ∣ S ∣ − x + 1 \frac{1}{|S|-x+1} Sx+11的概率會在 x x x 的前面選到比x大的數,所以對於 S i S_i Si的所有排列的答案即為 ∣ S ∣ ! × ∑ i = 1 ∣ S ∣ 1 i |S|! \times \sum_{i=1}^{|S|} \frac{1}{i} S!×i=1Si1
所以對於所有的點 i i i ,其刪邊排列大小為 d e p i dep_i depi,( d e p i dep_i depi i i i 的深度, d e p 1 = 0 dep_1=0 dep1=0(想一想為什麼))。
於是答案就是 ∑ i = 2 n ∑ j = 1 d e p i 1 j \sum_{i=2}^{n}\sum_{j=1}^{dep_i} \frac{1}{j} i=2nj=1depij1

相關文章