设询问 ( l , r , z ) (l,r,z) (l,r,z) 表示 ∑ i = 1 r d e p [ L C A ( i , z ) ] \sum_{i=1}^{r}dep[LCA(i,z)] ∑i=1rdep[LCA(i,z)]。
首先先对询问式做一个差分:
( l , r , z ) = ( 1 , r , z ) − ( 1 , l − 1 , z ) (l,r,z)=(1,r,z)-(1,l-1,z) (l,r,z)=(1,r,z)−(1,l−1,z)
那么我们可以考虑将一个询问 ( l , r , z ) (l,r,z) (l,r,z) 拆成两个询问 ( 1 , r , z ) (1,r,z) (1,r,z) 和 ( 1 , l − 1 , z ) (1,l-1,z) (1,l−1,z)。
然后思考对于形如 ( 1 , r , z ) (1,r,z) (1,r,z) 的询问怎么计算贡献。
注意到对于 d e p [ L C A ( x , z ) ] dep[LCA(x,z)] dep[LCA(x,z)] 我们可以这样处理:先将根节点到 x x x 的路径上所有点点权加一,然后查询根节点到 z z z 路径上的点权和。所有点初始为 0。
这个正确性是对的,参照下面 3 张图理解即可。
这样单次询问就解决了。
对于所有的 ( 1 , r , z ) (1,r,z) (1,r,z) 询问,我们首先按照右端点排序,排序完成之后用一下树剖,我们就可以做到独立 O ( n log n ) O(n \log n) O(nlogn) 完成区间加操作。
路径询问?也是树剖可以完成的。
不考虑预处理复杂度,总询问复杂度是 O ( q + n log n ) O(q+n \log n) O(q+nlogn)。