杂题

题意

给定\(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\)计算即可

题外话

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

posted @ 2020-05-13 15:26  Grice  阅读(103)  评论(0)    收藏  举报