[樹的點分治] [BZOJ3648] 寢室管理

題目描述 Description

T64有一個好朋友,叫T128。T128是寄宿生,並且最近被老師叫過去當宿管了。宿管可不是一件很好做的工作,碰巧T128有一個工作上的問題想請T64幫忙解決。
T128的寢室條件不是很好,所以沒有很多錢來裝修。禮間寢室僅由n1 條雙向道路連接,而且任意兩間寢室之間都可以互達。最近,T128被要求對一條路徑上的所有寢室進行管理,這條路徑不會重複經過某個點或某條邊。但他不記得是哪條路徑了。他只記得這條路徑上有不少於k 個寢室。於是,他想請T64幫忙數一下,有多少條這樣的路徑滿足條件。
嗯…還有一個問題。由於最近有一些熊孩子不準晚上講話很不爽,他們決定修築一條“情報通道”,如果通道建成,寢室就變成了一個n 個點n 條邊的無向圖。並且,經過“情報通道”的路徑也是合法的。T128心想:通道建成之前,T64還有一個高效的算法幫我數路徑條數,但是通道建成之後,他還有辦法嗎?對,T64手忙腳亂,根本數不清有多少條路徑。於是他找到了你。

輸入 Input

第一行爲三個正整數nmk2kn ),代表有n 間寢室,m 條邊連接它們(n1mnm=n1 意味着“情報通道”未被修好;m=n 意味着“情報通道”已被修好),以及題目描述中的k
接下來m 行,每行兩個正整數xy ,代表第x 間寢室與第y 間寢室之間有一條雙向邊。

輸出 Output

僅包含一個整數,代表經過至少k 間寢室的路徑條數。

樣例輸入 Sample Input

5 5 2
1 3
2 4
3 5
4 1
5 2

樣例輸出 Sample Output

20

提示 Hint

Hint

限制 Limits

n105,knm 的要求如輸入
Time Limit : 4s & Memory Limit : 512MB

給出了一個基環外向樹,如何點分治?
把環幹掉就是普通點分治了,所以先把環幹掉再考慮環對子樹的影響,去環這個過程可以並查集實現。
先普通點分治一遍,對於樹的情況,直接輸出,下面考慮環的情況。
從斷點開始,掃一遍環上的外向樹,只有這棵樹裏的點經斷掉的邊到其他外向樹上的點才能計入答案,因爲其他的情況在普通點分治裏已經統計過了。這個可以用樹狀數組維護。
統計的是這棵外向樹上的基點(就是在環上的點)到斷點一端的距離和其餘外向樹到斷點另一端的距離和大於等於k1 的情況數。
樹狀數組的維護可以很奇妙……
不要忘了開long long……
向因爲被我霍霍壞了退役四天的TP默哀一秒……
Code

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