1. 程式人生 > >淺析樹鏈剖分Orz

淺析樹鏈剖分Orz

淺析 大於 ref www. 都是 超過 並且 最大 pan

本文思路參考自何開大佬

引子

相信各位大佬一定會線段樹這種非常實用的數據結構

那麽如果我們要維護一棵樹上的鏈的權值的時候怎麽辦

就比如說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