这题主要是用到了一个非常妙的 trick——
求一个点集中所有点与一个另外钦定的点的距离和。
首先可以把两点距离转化为到根的距离相减,即 disx+disy−2dislca。
那么在整个式子里,这个钦定的点的 dis 是固定的,另一个 dis 也比较好求。
发现 dislca 的部分就是两条到根路径的交。
所以可以对于这个点集里所有点都对其到根路径每条边覆盖次数加一,然后从钦定点到根计算贡献,一条边的贡献是覆盖次数乘边权。
那么这个题就好办了,我们把询问也换成到根相减的形式,那么问题变成 ∑i∈path(root,u)dist(pi,k) 这就是上面那个 trick 了。
可以在一开始用主席树对于每个点 u 维护所有 pi 到根路径覆盖次数加一的结果,其中 i∈path(root,u)。
然后询问就在对应的主席树上计算到根的贡献即可。
代码:
1 |
|