【trick】树上路径长度查询->LCA深度查询->到根节点路径权值和查询

树链剖分

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)

posted @ 2021-05-02 22:58  仰望星空的蚂蚁  阅读(22)  评论(0)    收藏  举报  来源