洛谷3178 [HAOI2015]树上操作(树上树状数组-改段求段)(线段树)

版权声明:本文为博主原创文章,未经博主允许不得转载,除非先点了赞。 https://blog.csdn.net/A_Bright_CH/article/details/82385382

题目

有一棵点数为 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直接输出就可以了。

代码

咯咯咯

猜你喜欢

转载自blog.csdn.net/A_Bright_CH/article/details/82385382