树剖 + 主席树.
先不考虑年龄的限制,那么询问 $u$ 的答案就是
$$
ans=\sum_{v} dis(u,v) \\
ans=\sum_v dist(u)+dist(v)-2\times dist(lca(u,v)) \\
ans=n\times dist(u)+\sum_v dist(v) -2\times \sum_v dist(lca(u,v))
$$
其中 $dist(x)$ 表示 $x$ 到根节点的距离.
前两项容易算出,最后一项的求法是经典套路.
对每条边维护一个贡献值,对于每个 $v$ ,将 $v$ 到根路径上每条边的贡献加上它的长度.
那么 $\sum_v dist(lca(u,v))$ 就等于 $u$ 到根路径上每条边的贡献之和.
修改贡献和查询贡献可以利用差分实现,考虑年龄的限制,可以先把年龄离散化,然后用树剖 + 主席树来维护贡献.
由于要在主席树上实现区间加的操作,所以要用标记永久化.
时间复杂度 $O(n\log^2 n)$ .
1 | //%std |