DTOJ 樹的解構
題目
Mivik
喜歡 Eprom
的解構俱樂部,於是他想解構一棵樹。
Mivik
找到了一棵以
1
1
1 為根的有
n
n
n 個結點的有根外向樹。Mivik
會進行
(
n
−
1
)
(n − 1)
(n−1) 次操作,每次 Mivik
都會從未刪掉的邊中等概率選擇一條邊將其刪去。記這條邊為
a
→
b
a → b
a→b,則刪去這條邊的代價是刪邊時
b
b
b 的子樹大小(包括
b
b
b 自己);刪去這條邊後
b
b
b 為根的子樹會形成一棵新的以
b
b
b 為根的有根樹。
例如,下圖是 Mivik
找到的有根樹:
如果 Mivik
選了
1
→
2
1 \to 2
1→2 這條邊並將其刪去,那麼代價是
3
3
3(
2
2
2 所在的子樹內共有
2
,
4
,
5
2,4,5
2,4,5 三個結點),而後情況會變成這樣:
如果 Mivik
此時再刪去
2
→
4
2 \to 4
2→4 這條邊,那麼代價是
1
1
1(
4
4
4 所在的子樹內只有
4
4
4 一個結點),
隨後情況會變成這樣:
Mivik
想知道,他進行這
(
n
−
1
)
(n − 1)
(n−1) 次操作後期望的代價總和是多少。由於 Mivik
不喜歡太大的數,你只需要輸出期望的值對
1
0
9
+
7
10^9 + 7
109+7 取模的結果。
資料範圍
對於所有測試點,滿足
1
≤
n
≤
2
×
1
0
6
1 \leq n \leq 2 \times 10^6
1≤n≤2×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 n≤500 |
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}
∣S∣−x+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=1∣S∣i1。
所以對於所有的點
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=2n∑j=1depij1。
相關文章
- 樹的解構 題解
- DTOJ#5127. 字串字串
- DTOJ#5214. 第一題
- 2018.10.30-dtoj-4010-秀秀的照片(photo)
- 【資料結構】B樹、B+樹詳解資料結構
- DTOJ#5164. 鬼淵傳說
- 樹的同構
- 樹的學習——樹的儲存結構
- Fiber 樹的構建
- BZOJ4337: BJOI2015 樹的同構(hash 樹同構)
- 用python講解資料結構之樹的遍歷Python資料結構
- 樹結構的應用
- Vue動態構建混合資料Treeselect選擇樹及巨樹問題的解決方法Vue
- WebKit Inside: DOM樹的構建WebKitIDE
- 自動平衡二叉樹的構建-AVL樹二叉樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 資料結構之樹( 線段樹,字典樹)資料結構
- 資料結構的故事之二叉樹, 字首樹, N叉樹資料結構二叉樹
- Kruskal 重構樹
- Kruskal重構樹
- 樹形結構
- PHP 陣列轉樹結構/樹結構轉陣列PHP陣列
- [資料結構] 樹、二叉樹、森林的轉換資料結構二叉樹
- 資料結構——樹與二叉樹的遍歷資料結構二叉樹
- 圖解 -- 樹的彙總圖解
- 樹狀的資料結構的建立資料結構
- 樹的另一個構建方式
- 樹形資料構造的方法
- LayUI—tree樹形結構的使用UI
- JZ-017-樹的子結構
- 二叉樹的子結構二叉樹
- 淺談樹形結構的特性和應用(上):多叉樹,紅黑樹,堆,Trie樹,B樹,B+樹...
- 資料結構(樹):二叉樹資料結構二叉樹
- BZOJ4337 [BJOI2015] 樹的同構 樹上雜湊
- Note - kruskal 重構樹
- XML 樹結構概述XML
- 【Algorithm】樹結構整理Go
- 資料結構——樹資料結構