题意简述
给你一颗n<=1e5个节点树,1e5次询问,每次给你(l,r,z),求[l,r]区间内每个数和z在树上LCA的深度的和。对201314取膜。
注:根节点深度是1。
思路框架
(x,y)的LCA深度就是,把x到根点权+1,然后询问根到y点权和多少。
那么我们相当于,把[l,r]每个点到根点权都+1,然后询问根到z的点权和。差分做。
具体思路
差分做法:把一个询问(l,r,z)拆成(1,r,z)和(1,l-1,z)。(l,r,z)的答案显然就是(1,r,z)-(1,l-1,z)。这样我们要求的就是若干的前缀点的答案了。
我们把l-1和r都打上标记i从1到n遍历一下,不断在根到i的路径上点权+1。的如果某个点有标记,那么就把所有的z拿出来询问一遍,更新询问的答案。这样是O(nlogn+q)。
还有,对于每个标记,还要记录是l-1还是r,因为l-1的答案还要带一个负号。
代码
1 |
|