學習筆記 點分治學習筆記

2021-08-04 05:45:50 字數 444 閱讀 4533

點分治學習筆記

oi中有一類在樹上與路徑有關的題目。

如果直接列舉兩個端點複雜度至少o(n^2)通常無法承受。

如果考慮列舉路徑的lca通過一些奇技淫巧計算,通常至少需要dfs一遍子樹,複雜度依舊無法承受。

因此可以考慮將所有路徑分為兩類:經過x的和不經過x的。

將經過x的路徑全部處理完了之後,相當於是把x去掉,原圖變成森林,對每一顆樹進行類似做法。

顯然如果每一層計算的複雜度是o(n)的話那麼最終複雜度取決於層數。

顯然希望x的每顆子樹不會大於原來的sz的一半,其實就是在求重心。

做法是堆每個點計算其子樹最大值,更新即可。

模板:(未編譯不知對不對)

int get_rt(int x,int f)

maxsz[x]=max(maxsz[x],full_sz-sz[x]);

if(maxsz[x]

點分治學習筆記

點分治主要用來處理樹上路徑問題,可以統計樹上點到點的所有路徑,複雜度o nlogn 基於樹上的結點進行分治,不斷將一棵樹拆成多顆子樹處理 選擇點時為了防止退化成鏈的情況,如果選點後左右子樹越大,遞迴層數越多,時間越慢,反之則越快,我們每次選擇子樹內的重心 void getroot int u,int...

點分治學習筆記

關於點分治,其實思想是非常好理解的,模擬在數列上或是在平面上的分治演算法 如歸併排序,平面最近點對等 我們可以從字面上理解該演算法 以乙個點為界限,將一棵樹分成若干個子樹,當劃分到一定規模,就對每個子樹分別進行求解 感性理解就好了 感受乙個演算法最直觀的辦法,就是來看一道模板題。給定一棵有 n 個點...

點分治學習筆記

point divide and rule 澱粉質就是在樹上,依靠不停的遞迴和分治,解決相同的子問題 先來看看模板題 tree 就是找樹上 k 的路徑有多少 我們可以分兩種情況討論 1.經過根節點 p 的路徑 2.不經過根節點 p 的路徑 第二種情況可以通過遞迴來處理,我們直接來討論第一種情況 設當...