學習筆記 樹鏈剖分

2022-05-20 09:39:45 字數 1184 閱讀 6797

瀟爺的講解。。十分的nice,可惜人傻。。。然而yveh似乎很早就a過一道題。。。。現在開始學。。。
樹鏈剖分就是茲辭把一棵樹上的資訊,切成多條鏈,再把這些鏈hash到某資料上,是之茲辭對原樹上的資訊進行快速的查詢與修改。

把樹上的路徑分類為重鏈和輕鏈

ps此處為鏈剖線段樹qwq

定義:**重兒子:**siz[u]為v的子節點中siz值最大的,那麼u就是v的重兒子。

輕兒子:v的其它子節點。

重邊:點v與其重兒子的連邊。

輕邊:點v與其輕兒子的連邊。

重鏈:由重邊連成的路徑。

輕鏈:輕邊。

剖分後的樹有如下性質:

性質1:如果(v,u)為輕邊,則siz[u] * 2 < siz[v];

性質2:從根到某一點的路徑上輕鏈、重鏈的個數都不大於logn。

預處理:(dfs_1 && dfs_2)

dfs_1:

求出樹上每個節點的深度deep[i],根的子樹大小size[i],祖先的資訊fa[i].以及son[i]之類的資訊.

dfs_2:

⒉對於v的各個輕兒子u,顯然有top[u] = u,並且w[u] = totw+1,進行dfs_2過程。

這就求出了top和w。

具體**:

void dfs_1(int

now,int f,int d)

}

void dfs_2(int

now,int number)

}

修改:

1.點修改 :根據編號在資料結構中修改

2.區間修改:(1)若l,r在一條重鏈上,直接修改loc[l]-loc[r]

(2)若l,r不在一條重鏈,一邊進行修改,一邊同時向上靠,靠的同一條重鏈上,變為情況(1)

查詢操作同上…

鏈剖線段樹模板題:(不穩定傳送門)

樹鏈剖分學習筆記

寫 又犯了很sb的錯誤,線段樹寫錯了。好像每次都會把r l 1寫成l r 1,然後就只有20分。寫的比較醜,壓了壓之後190行。基本上是我打過的最長的乙個模板了 然後簡單介紹一下樹剖吧。樹鏈剖分,就是把樹剖分成鏈,然後用資料結構來維護這些鏈,使得詢問 修改的複雜度達到o logn o l ogn 不...

樹鏈剖分學習筆記

樹鏈剖分 mod estc oder modestcoder modest code r如果你是重兒子,你就在重路徑上。如果你是輕兒子,暴力沿著祖先向上爬最多log nlogn logn 次就可以遇到重路徑。或者到根 而樹上操作基本就是找祖先 也許有人喜歡我的碼風 include include d...

樹鏈剖分學習筆記

前言 書上只講了重鏈剖分,菜雞也只會這一種,想看其他的是別想了。要會樹鏈剖分,首先你需要了解一些概念。我們把乙個節點的所有兒子節點中子樹節點數最大的稱為重兒子,也就是size最大的子節點。size的定義我在講換根dp時說過,因此不再贅述。對於每個節點的重兒子,我們用 son x 來記錄它,父親節點到...