前置知識:樹的重心
對於一顆無根樹上的每一個點,計算其所有子樹中最大的子節點數,這個值最小的點就是樹的重心,用樹形dp可以\(O(n)\)求解
1. 定義
點分治,又叫樹分治,點分治是一種在樹上進行路徑靜態統計的演算法,所謂樹上的靜態統計,並不是像樹剖一樣維護路徑最值,路徑之和一類的統計,點分治的本質其實是將一棵樹拆分成許多棵子樹去處理,並不斷進行,通常的,對於點分治能解決的問題,都是與樹上路徑統計有關的問題
2. 具體思路
對於一個序列上的區間和等操作,我們可以將原問題分解為幾個子問題來求解之後再一一合併答案,而在樹上我們依然可以進行這種操作,,但是樹上每一個子樹的節點數量是不確定的,不能單單取中點,或直接取1號子樹
例如,若每一條邊(u,v)滿足u=v-1,則直接取1的時間複雜度為\(O(n)\),但若取\(\frac{n}{2}\),則時間複雜度為\(O(logn)\)
所以考慮樹的重心,當選擇樹的重心為分支點時,是最優的,接著考慮分治