Question
求f(i)=ΣW[lca(i,j)] (i=1~n,j=1~i-1)
Tips
树链剖分+线段树(lazy)+差分思想?
Solve
考虑到每次询问为前i-1个点的贡献,所以先查询再插入进行修改。联想到LNOI的一道树链剖分题求的是g(i)=Σdep[lca(i,j)],做法是插入点时将点到根节点的路径上各点权值都+1,这样对于g(i)的询问,求的就是i点到根节点的路径上点的权值和,原因如下图
例如查询点4的时候,4到根节点所包含的各段路径长度即为各最近公共祖先的dep。同理,若讨论w[lca(i,j)],线段树每个叶子节点上记录的ans值为差分后的若干倍w’,具体实现时w’=w-w[fa],区间插入时一段连续的w’的和可按dfs序用前缀和做差来计算。
Step
1. 插入点i:
将i到根节点的区间上
1)点数+1(lazy)
2)ans值+该区间w’的和
2. 查询点i+1:
统计i+1到根节点区间上的ans值的和
Code
AC