1. 程式人生 > 其它 >C# 四種圖形填充效果

C# 四種圖形填充效果

樹鏈剖分

定理

  • 重兒子:一個節點所有兒子中,子樹大小最大的兒子即為重兒子,如有多個,任取一個即可。
  • 輕兒子:除了重兒子外的所有兒子。
  • 重邊:父節點 \(\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}\)
    :即把 \(dfs\) 序的一段連續區間求和或修改。

維護就與此題類似。