淺析樹鏈剖分Orz
本文思路參考自何開大佬
引子
相信各位大佬一定會線段樹這種非常實用的數據結構
那麽如果我們要維護一棵樹上的鏈的權值的時候怎麽辦
就比如說BZOJ1036樹的統計這道題目
可能諸位草率地想想線段樹是可以口頭AC的,But 這是在一棵樹上,線段樹支持的連續的區間操作
在這棵樹上,如果鏈的編號斷斷續續,那麽我們的線段樹就和暴力沒有什麽區別有一點點區別了
概念
所以這裏就需要用到樹鏈剖分,這種可以支持樹上鏈操作的數據結構
樹鏈剖分有很多高大上的名詞需要我們去記
我們先定義一些概念東東
size[u]表示以u為根的樹的大小
dep[u]表示u的深度(根的深度定為1)
fa[u]表示u的爸爸(???)
有了這些東東,我們開始定義真正的概念
重兒子:u的所有兒子v中,size[v]最大的v稱為u的重兒子
輕兒子:u的所有兒子v中,不是重兒子的都被叫做輕兒子
重邊:u 連向它的重兒子的邊稱為重邊
沁輕邊:u連向它的輕兒子的邊稱為輕邊
重鏈:組成這條鏈的所有的邊都是重邊
沁輕鏈:組成這條連的所有邊都是輕邊
一些小性質
性質1:V為u的輕兒子,則必有size[V] <= size[u] / 2
這個性質證明可以用到反證法
如果存在V為輕兒子並且size[V] > size[u] / 2
我們會發現如果一個節點成為重兒子的條件就是size[V] >= size[u] / (SonNumber[u]) //SonNumber[u]表示u的兒子的數目
因為size[u] / 2 > size[u] / 3 > size[u] / 4 ………………………………
而且size[V] 是不可能大於size[u]的
所以,V為這時候只能為重兒子
與假設不符
證畢~~~~
性質2:從根到某一節點的路徑上,輕邊的數量不超過O(log N),重鏈的數目不超過O(log N)
這個我們也是可以證明的
因為我們可以從性質1直接推得輕邊的數量不超過O(log N)
後來我們發現
沒存在一條輕邊,就會出現兩條重鏈
所以重鏈的數量不超過O(log N)
證畢~~~~
操作
淺析樹鏈剖分Orz