樹鏈剖分的基本思想
阿新 • • 發佈:2018-01-01
一個 概念 span fat 基本 clas 同時 如果 i節點
一、樹鏈剖分的作用
通常是求樹上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同時跳到他們的重鏈的頂端,然後跨越輕邊,繼續剛才的過程
其實上面的區間修改和區間查詢可以用線段樹來實現
樹鏈剖分的基本思想