HDU5405

给出一颗带点权的树。

支持两种操作:

1)单点修改点权。

2)输入(u,v),输出(sum_{i=1}^nsum_{j=1}^nf(i,j))

如果(i,j)这条路径和(u,v)有交点,(f(i,j)=w_iw_j)

(i,j)的乘积

做法:

答案相当于权值之和的平方,减去把((u,v))这条链扣掉,各个子树的权值之和的平方。

这里是一个树链剖分的技巧。

就是对每个节点,分别维护轻儿子的和平方、重儿子的和平方。

对树上一条链,往上跳重儿子链的时候,就直接线段树区间求和。因为这条链上的节点都是父亲节点的重儿子,线段树维护的本来就已经是答案了。

剩下周赛回来补。

原文地址:https://www.cnblogs.com/zhanglichen/p/15448897.html