EX: 多筆詢問樹上兩點路徑和,支援修改
修改,詢問皆log^2 n以下
每條重鍊不會有分支(每個點只會有一個重子樹)
所以重鍊可以當序列處理
從葉節點往上到根節點,其路徑最多分別會遇到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)
By alan lai