C# 四種圖形填充效果
阿新 • • 發佈:2022-06-05
樹鏈剖分
定理
- 重兒子:一個節點所有兒子中,子樹大小最大的兒子即為重兒子,如有多個,任取一個即可。
- 輕兒子:除了重兒子外的所有兒子。
- 重邊:父節點 \(\to\) 重兒子的邊。
- 重鏈:由重邊構成的極大鏈。
如以下圖。
過程
\(dfs\) 序:優先遍歷重兒子,這樣就可以保證重鏈上所有點的編號連續。
如下圖,藍色數字即為求完 \(dfs\) 序後所有點的編號。
求完 \(dfs\) 序即將樹轉化成序列。
定理:樹中任意一條路徑均可拆分成小於等於 \(\log n\) 條重鏈,即可拆分成小於等於 \(\log n\) 連續區間。
將一條路徑拆分成若干條條重鏈
這個過程類似於倍增求 \(lca\)
假設求 \(x, y\) 的若干條重鏈。
如果 \(f_x > f_y\) 則先將 \(x\) 跳到該節點所在重鏈的頂部再走到他的父節點上。
如果 \(f_y > f_x\) 則先將 \(y\) 跳到該節點所在重鏈的頂部在走到他的父節點上。
其中 \(f\) 表示該節點的深度,即該節點在樹的第幾層。
最後一定會走到同一條重鏈上。
以上操作可以用線段樹/分塊/Splay 來維護。
例題
\(\mathcal Preface\)
\(\mathcal Solution\)
- 操作 \(\mathit{1 \sim 2}\):即用前述的樹鏈剖分的思想。
- 操作 \(\mathit{3 \sim 4}\)
維護就與此題類似。