點分治學習筆記

wangsiqi2010916發表於2024-04-11

前置知識:樹的重心

對於一顆無根樹上的每一個點,計算其所有子樹中最大的子節點數,這個值最小的點就是樹的重心,用樹形dp可以\(O(n)\)求解

1. 定義

點分治,又叫樹分治,點分治是一種在樹上進行路徑靜態統計的演算法,所謂樹上的靜態統計,並不是像樹剖一樣維護路徑最值,路徑之和一類的統計,點分治的本質其實是將一棵樹拆分成許多棵子樹去處理,並不斷進行,通常的,對於點分治能解決的問題,都是與樹上路徑統計有關的問題

2. 具體思路

對於一個序列上的區間和等操作,我們可以將原問題分解為幾個子問題來求解之後再一一合併答案,而在樹上我們依然可以進行這種操作,,但是樹上每一個子樹的節點數量是不確定的,不能單單取中點,或直接取1號子樹

例如,若每一條邊(u,v)滿足u=v-1,則直接取1的時間複雜度為\(O(n)\),但若取\(\frac{n}{2}\),則時間複雜度為\(O(logn)\)

所以考慮樹的重心,當選擇樹的重心為分支點時,是最優的,接著考慮分治

相關文章