杂题

题意

给定(n)点的带点权树,(q)次查询,给定(u,v),令(S)(u,v)路径的上点,求(sumlimits_{xin S} dis_{u,x}~or~a_x)

做法

(up_{i,j})(i)点往上(2^j)这条路径上以(i)为起点的询问和
(down_{i,j})(i)点往上(2^j)这条路径上以(i)为终点的询问和
更新就是利用(up_{i,j-1},up_{fa_{i,j-1},j-1})更新,以为这条路径分为了([0,2^{j-1}),[2^{j-1},2^j)),上半段路径前面加了一个(1),只要把格外的这个贡献算进去即可
(down_{i,j})类似

然后查询((u,v))
(l=lca(u,v))(u)往上爬时用(up)计算,(l)往下走可以看作是将(u-l)翻折到(l)的祖先然后后半段贡献,两次用(down)计算即可

题外话

咋连联赛题都做不动了啊...

原文地址:https://www.cnblogs.com/Grice/p/12882592.html