樹鏈剖分入門

2021-10-03 12:24:55 字數 1003 閱讀 3834

例題

poj 3237()

bzoj 3083

bzoj 3531

bzoj 3589

bzoj 3626

將樹上問題通過dfs序的性質轉換為區間問題,從而對樹上修改時就可轉化為相應的區間修改。再通過引入重兒子,重鏈一系列概念將時間複雜度也變成了可以接受的層次

通過兩次dfs求出樹上一系列的資訊

void

dfs1

(int u)

}void

dfs2

(int u)

}

更新樹上資訊可分為 更新點權和更新邊權

由於dfs序rk和pos陣列是點的相應順序排列的

所以當處理點權的時候我們直接更新兩點間的資訊即可

而當更新邊權時,我們選擇架空根節點,那麼點權就可以變成邊權了,所以對應跳重鏈的過程也有一點不同。具體看**

點權

int

querymax

(int x,

int y)

if(dep[x]

)swap

(x,y)

;return re=

max(re,

treequerymax(1

,1,n,pos[y]

,pos[x]))

;}

邊權

架空根節點後 dfs序的每個點的價值就變為該點與其父親節點的邊權值

那麼在跳重鏈的過程中,假如dep[x]int

querymax

(int x,

int y)

if(x==y)

return;if

(dep[x]

)swap

(x,y)

;return re=

max(re,

treequerymax(1

,1,n,pos[son[y]

],pos[x]))

;}

樹鏈剖分入門

我學的學習資料 和 ppt 樹鏈剖分可以解決很多問題,輔助一些線段樹之類的資料結構可以解決一些樹上修改的問題。還可以求lca,不過複雜度比rmq實現的lca多乙個log。下面是樹鏈剖分實現的lca 1 const int maxn 5e4 10 2 struct data edge maxn 1 5...

樹鏈剖分入門

將樹分割成多條鏈,然後用線段樹等來維護這些鏈。樹鏈剖分的分割標準 連線乙個節點的子樹中的 重兒子 也就是結點最多的兒子,依次連下去。定義 重兒子 子樹節點的兒子 輕兒子 除了重兒子以外的兒子 重邊 父節點與重兒子組成的邊 輕邊 除重邊以外的邊 重鏈 重邊連線而成的鏈 輕鏈 輕邊連線而成的鏈 鏈頭 一...

演算法入門 樹鏈剖分 輕重鏈剖分

目錄 3.0 求 lca 4.0 利用資料結構維護資訊 5.0 例題 參考資料 資料結構入門 線段樹 發表於 2019 11 28 20 39 dfkuaid 摘要 線段樹的基本 建樹 區間查詢 單點修改 及高階操作 區間修改 單點查詢 區間修改 區間查詢 標記下傳 標記永久化 閱讀全文 樹鏈剖分用...