题目
有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权
增加 a 。操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。操作 3 :询问某个节点 x 到根的路径中所
有点的点权和。
题解1
树链剖分
裸啊!
对于子树操作,最合适的结构就是dfs序了,恰好树链剖分就是带重边的dfs序。
接下来自己yy吧。
题解2
树状数组-改段求段+线段树
类似树状数组改段求段的思想,给每个节点开设一个a和b,d[i]表示1-i的距离,则d[i]=a[i]*dep[i]+b[i]。
dfs序不能少。
对于操作1,直接给那个节点的b加x。
对于操作2,把x子树里的所有节点(一个是y)的a加x,相当于d加上了x*dep[y],而我们期望的是加上x*(dep[y]-dep
[x]+1)。所以b加上-(dep[x]-1)*x。
操作3直接输出就可以了。
代码
咯咯咯