DistanceQueriesonaTree
[ABC294G] Distance Queries on a Tree
首先树剖+线段树肯定可以直接用树剖模板过掉,但是带两个 \(\log\)。
我们考虑更优秀的做法。
拟定 \(1\) 为根,首先维护前缀 \(dis[i]\) 为从 \(1\sim i\) 的路径上的所有边权之和(这里记边权为在下面的点的点权)。显然,没有修改时答案是 \(dis_a+dis_b-2dis_{LCA(a,b)}\)。但是有了修改怎么办呢?我们可以先用树剖搞定 LCA
,同时 dfs
序又有了,因为一个子树内的点 dfs
序连续,就可以使用树状数组的区间修改单点查询。具体而言,对于修改了一条边,那么这条边下面的子树的 \(dis\) 均会增加,利用 dfs
序修改区间。复杂度为 \(O(n\log n)\)。