树链剖分
eg.求 d i s ( x , y ) dis(x,y) dis(x,y)
d i s ( x , y ) = d i s ( x ) + d i s ( y ) − 2 d i s ( l c a ( x , y ) ) dis(x,y)=dis(x)+dis(y)-2dis(lca(x,y)) dis(x,y)=dis(x)+dis(y)−2dis(lca(x,y))
一般来讲,如果题目只是叫我们求距离,我们可以不用把 l c a ( x , y ) lca(x,y) lca(x,y) 求出来再带入运算。
可以将 ( 1 , x ) (1,x) (1,x) 的路径权值加一,再求 ( 1 , y ) (1,y) (1,y) 中的路径和就是 d i s ( l c a ( x , y ) ) dis(lca(x,y)) dis(lca(x,y))的答案,而 d i s ( x ) dis(x) dis(x), d i s ( y ) dis(y) dis(y) 已知,带入即可。
综上,我们将两点间的距离转化成了到根节点的权值和,使得查询从 O ( n l o g n ) O(nlogn) O(nlogn)变成了 O ( l o g n ) O(logn) O(logn)。