杂题
题意
给定\(n\)点的带点权树,\(q\)次查询,给定\(u,v\),令\(S\)为\(u,v\)路径的上点,求\(\sum\limits_{x\in 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\)计算即可
题外话
咋连联赛题都做不动了啊...

浙公网安备 33010602011771号