题目
思路
直接做是很困难的。
考虑这样构造一个可以做的实值函数 v ( x ) v(x) v(x) ,满足 ∑ u ∈ P a t h ( x , r o o t ) v ( u ) = d e p t h ( x ) k \sum_{u\in Path(x,root)}v(u) = depth(x)^k u∈Path(x,root)∑v(u)=depth(x)k
也就是说,每个祖先(包括自己)的 v v v 之和,恰好为 d e p t h ( x ) k depth(x)^k depth(x)k 。
如果我们成功的构造了这样的函数,显然, d e p t h ( l c a ) k depth(lca)^k depth(lca)k 就被 分摊到了 l c a lca lca 到根的路径上。
此时,我们只需要求 ∑ u ∈ P a t h ( Y , r o o t ) v ( u ) c n t ( u ) \sum_{u\in Path(Y,root)}v(u)cnt(u) u∈Path(Y,root)∑v(u)cnt(u)
其中 c n t ( u ) cnt(u) cnt(u) 表示以 u u u 为根的子树中,有多少个点编号在 [ 1 , X ] [1,X] [1,X] 范围内(此 X X X 为询问中的 X X X )。
其实这是很显然的,不妨看图:
此时,
l
c
a
(
y
,
x
1
)
lca(y,x_1)
lca(y,x1) 的值已经被分摊到了其到根的路径上——因为这个点的每个祖先的
c
n
t
cnt
cnt 都增大了
1
1
1 (并且被
y
y
y 所计算到了),所以总贡献就是其祖先(包括自己)的
v
v
v 之和,也即其
d
e
p
t
h
k
depth^k
depthk 。
x
2
x_2
x2 同理。
那么这个 v v v 应该是多少呢?其实很简单,构造一个即可: v ( x ) = d e p t h ( x ) k − [ d e p t h ( x ) − 1 ] k v(x)=depth(x)^k-\left[depth(x)-1\right]^k v(x)=depth(x)k−[depth(x)−1]k
正确性是显然的。这里我们充分运用了 d e p t h ( x ) − 1 = d e p t h ( f a x ) depth(x)-1=depth(fa_x) depth(x)−1=depth(fax) 的特点。
然后我们就可以做了!只需要 树链剖分(或者 L C T LCT LCT )即可。
按照 X X X 排序,每次插入,只是维护一个 c n t cnt cnt (和 c n t × v cnt\times v cnt×v )而已。毕竟 v v v (及 v v v 的和)可以预处理。
代码
咕咕咕……
我真的不想打了……