一、樹鏈剖分的作用
通常是求樹上u到v的路徑節點之和
這個問題很容易可以想到設f[i]表示根節點到i節點的節點之和
t=lca(u,v),然後可以把u->v劃分為u->t+t->v-t;
則有結論:u->v=f[u]+f[v]-2*f[t]+t,這樣就可以求出來了
但是加上u到v的路徑上的節點值的修改的話,就必須用樹鏈剖分了。。。
二、幾個概念:
1.重兒子:乙個節點的所有兒子中子樹最大的那乙個(相同任意取乙個)
2.輕兒子:除了重兒子以外的所有其他兒子
3.重邊:father連向重兒子的邊
4.輕邊:除了重邊以外的邊
5.重鏈:一條路徑,上面全部都是由重兒子構成(即全為重邊)
三、幾個推論:
1.兩條重鏈之間必然有一些輕邊連線
2.我們用一條重鏈的起始節點來表示一條重鏈(每個節點只會屬於一條重鏈)
3.bel[x]表示x節點的重鏈的開頭節點
四、問題的解決:
首先對於修改操作,將lca(u,v)求出,然後判斷bel[x]是否等於bel[y]
1.如果等於,那就可以直接對一條重鏈上的節點進行修改
2.如果不等於,那就把x和y同時跳到他們的重鏈的頂端,然後跨越輕邊,繼續剛才的過程
其實上面的區間修改和區間查詢可以用線段樹來實現
樹鏈剖分基本步驟
總體步驟 init dfs1 1 dfs2 1,1 build 1,1,n cl dfs1 處理出size sj 子節點數 son sj 重兒子 dep sj 深度 vi sj 點權,把邊權放在子節點上 dfs2 處理出top sj 所在鏈的鏈首,輕兒子從子節點重新開始,重兒子從父節點繼承 id s...
樹鏈剖分 樹鏈剖分講解
好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...
演算法入門 樹鏈剖分 輕重鏈剖分
目錄 3.0 求 lca 4.0 利用資料結構維護資訊 5.0 例題 參考資料 資料結構入門 線段樹 發表於 2019 11 28 20 39 dfkuaid 摘要 線段樹的基本 建樹 區間查詢 單點修改 及高階操作 區間修改 單點查詢 區間修改 區間查詢 標記下傳 標記永久化 閱讀全文 樹鏈剖分用...