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)\)

代码

posted @ 2023-07-01 11:45  wscqwq  阅读(6)  评论(0编辑  收藏  举报