樹練剖分:)

樹上修改&查詢

EX: 多筆詢問樹上兩點路徑和,支援修改

 

修改,詢問皆log^2 n以下

名詞定義

  • 重子樹:點數量最多的子樹(如果都一樣則選任意個)
  • 輕子樹:不是重子樹的其他子樹
  • 輕邊:連接輕子樹的邊
  • 重邊:連接重子樹的邊
  • 重鍊:一條連續的重邊
  • LCA(a, b):a,b的最小共同祖先

性質

每條重鍊不會有分支(每個點只會有一個重子樹)

所以重鍊可以當序列處理

從葉節點往上到根節點,其路徑最多分別會遇到log n個輕邊和重鍊

證明:

定義size(x)為點x的大小
假設b為a的輕子樹,c為a的重子樹

size(a)>=size(b)+size(c),且size(c)>=size(b),則size(a)>=2*size(b)成立

由size(a)>=2*size(b)可知,每次往上一個輕邊,你目前涵蓋的子樹大小就至少增加了兩倍,而最多也只有n個點,也就是說你只能往上log_2 n

而因為多個重鍊一定是由輕邊接起來的,所以已知有log n個輕邊,那最多就只會有log n +1個重鍊

操作

問a點到b點的路徑和

先只看a到lca(a, b)

從a往上,當遇到重鍊,區間查詢在那條鍊上會走到的範圍的和,並且直接跳到鍊的頂端

遇到輕邊,就直接一個一個往上加

有log n個重鍊,每次查詢log n (log n*log n)。並且有logn個輕邊

 

複雜度:O(log^2 n+log n)=O(log^2 n)

修改就直接改點的值(線段樹上or other thing)

hld

By alan lai

hld

  • 54