柚子快報邀請碼778899分享:[藍橋杯學習] 樹鏈剖分
柚子快報邀請碼778899分享:[藍橋杯學習] 樹鏈剖分
定義
將樹分割成若干條鏈,以維護樹上的信息,若無特殊需求,一般是重鏈剖分。
重鏈剖分
如何重鏈剖分
兩個dfs
第一個dfs是預處理各個結點的基本信息,第二個dfs是利用信息進行剖分(dfs序)
操作步驟
第一次dfs
更新當前結點信息(子樹個數(shù)、父結點信息、深度)對子結點進行dfs子結點dfs之后,把子結點的子樹個數(shù)加到父結點,更新重兒子。
第二次dfs
因為dfs序連續(xù)的值是一條鏈,所以,我們需要讓樹在進行dfs時,優(yōu)先對重兒子進行dfs,之后再對其它輕兒子進行dfs
重鏈剖分的應用
將剖分的重鏈放在線段數(shù)組或者樹狀數(shù)組上,然后在這個數(shù)據(jù)結構上進行維護。
對某條鏈上的節(jié)點進行更新
用數(shù)據(jù)結構對節(jié)點信息進行維護,進行區(qū)間查詢,區(qū)間更新。
對某節(jié)點子樹進行更新/查詢
由dfs序可知,某節(jié)點的入序和出序之間的連續(xù)數(shù)就是該節(jié)點的子樹。
查詢兩節(jié)點的最近公共祖先LCA
操作步驟:
當兩節(jié)點不在同一條鏈上時,選擇深度更淺的結點,跳到父鏈(鏈首的父結點)當兩節(jié)點在同一條鏈上時,深度更淺的點就是最近公共祖先LCA
查詢、修改兩節(jié)點之間路徑的信息
主體還是尋找LCA,就是如果跳到父鏈(或是其它點),把x到它首結點(其它點)之間結點信息進行更新。
柚子快報邀請碼778899分享:[藍橋杯學習] 樹鏈剖分
參考文章
本文內容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。