動態點分治入門隨講

2022-05-02 03:15:07 字數 1220 閱讀 9508

為什麼叫入門隨講呢……因為我也剛學完啊

點分治(這不是要學動態點分治嗎)

線段樹(會點分治不會線段樹?)

其實線段樹是來幫助理解的。

句句經典……在點分上沒有一定造詣還真寫不出來。

牆裂推薦一觀,文筆和思想都比某hr好多了。

**對點分治的一些理解——qt666

點分治是一種人人喜歡的演算法。它含鈣高,吸收好思想比較簡單,**實現也不難,複雜度瓶頸在統計跨重心root的鏈對答案的影響/貢獻。

但是點分治的缺點是很明顯的:它只能做離線問題!換句話說,它不支援修改操作。

這個時候就需要動態點分治來幫幫忙了。  

這個時候我們已經對點分治的理解很深了。它通過巧妙地在k級重心處劃分,把樹上的路徑劃分成了兩類:經過重心的和不經過重心的。

之所以複雜度***,是因為每個點作為鏈端點只會被統計log次。

帶修改的話,暴力肯定是詢問一次做一次點分。

注意到修改的基本是點權之類的而不是樹的形態。換言之,每次的點分過程是一樣的!

然後又想到每個點只會被統計log次——

胡不重構此樹乎?

講清楚點:既然每次修改只會改乙個點,只會把它作為端點的鏈的資訊改掉。

(要是你改乙個點會引起多個點改動也不像是樹分治題而更像傳統資料結構題)

其他的點的資訊該是多少還是多少,是不變的過往,是永恆的黑暗與孤獨——打住。

多次處理重複相同資訊,是必不可能被我們所稱讚的。而這些資訊總的數量級又只有o(nlogn)級別。

為什麼不把它事先儲存,然後對於每次修改,o(logn)級別地暴力一一修改呢?

每次查詢,要麼直接取,要麼暴力跳乙個點的重心祖先鏈,複雜度也很優秀。

即:預處理點分治一遍,把分級重心樹搞出來,把資訊存進去。

每次操作,修改即想辦法修改自己到祖先重心鏈上的資訊即可。

詢問呢,你都維護了這麼多東西了,也是想辦法快速求就可以了。

比如說取最大值,那就開堆嘛(zjoi捉迷藏)。

再比如說hnoi開店,用vector動態申請空間,排序一下,每次詢問暴跳祖先。

說起來好像很簡單,實現起來卻是如人飲水冷暖自知。

剩下的我一時也不知道還能講什麼了?……

送一句話:樹上的動態點分治就相當於序列上的線段樹。

忘記是從哪個神犇那蒯的了……

兩點lca什麼的別用倍增了,用尤拉序列+st表預處理o(1)搞定。

還有記得把log也預處理出來,系統超慢。

開堆開桶之類的,vector或new

點分治 動態點分治

實在拖得太久了。先扔掉資料 分治的核心是盡量把乙個整體分成接近的兩個部分,這樣遞迴處理可以讓複雜度從n 變成nlogn。兩個問題,如何區分和如何算答案。對於第乙個問題,重心,然後就是找重心的方法,兩個dfs,對於第二個問題,對於每個重心算當前塊中每個點到重心的答案,然後由重心分開的塊要把多餘的資訊去...

點分治與動態點分治

點分治一般是用於解決樹上路徑問題。樹的重心 把重心這個點割掉後,使所形成的最大的聯通塊大小最小的點。可以證明重心子樹的大小最大不會超過 n over 2 重心可以通過 dfs 一遍求出。maxsiz x 表示割掉點x後所形成的的最大的聯通塊的大小 void dfs int x,int fa max ...

動態點分治

由於蒟蒻太遜,現在才開始學動態點分治,寫乙個 blog 吧。動態點分治是利用點分治的過程,建成一顆由子樹重心連線而成的點分樹,這棵樹的高度為 log n 級別的,因此可以通過暴力跳父親完成修改操作。建立點分樹的過程,就是按照點分治的流程,記錄上級重心並連線,即可獲得一棵點分樹。點分樹的結構與原樹不相...