動態點分治總結

2022-05-02 03:36:10 字數 466 閱讀 9542

標籤: 動態點分治

其實也沒有做很多道題,但是還是總結一波吧.......

要知道動態點分治,首先得知道點分治.

點分治就是對於乙個聯通塊,求出這個聯通塊的重心,然後把這個聯通塊分為很多個聯通塊,這些聯通塊都為這個重心的子樹,那麼求出這些子樹對於重心的貢獻,然後遞迴地做下去,由於重心的每一棵子樹大小都小於聯通塊的一半,那麼可以達到快速求解的目的.

動態點分治,在點分治的基礎上,利用分治的過程重新構建一顆點分樹,那麼每一次修改都只會影響到點分樹上的父親節點,重新計算對於這些節點的貢獻即可,由於點分樹的高度是嚴格log的,那麼每一次修改都只需要修改log個節點的貢獻.

在修改的過程中,動態點分治可以十分靈活,不過不可避免的要寫個求lca,個人的習慣是寫樹鏈剖分,因為複雜度不是滿的.對於維護,可以有很多種維護方式,通常都需要維護聯通塊到自己這個重心,和父親重心的貢獻,至於用什麼來維護,根據題目而定,像線段樹(動態開點),堆,陣列等都是可以的.

點分治 動態點分治

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

點分治與動態點分治

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

動態點分治

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