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

题目

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

 

代码

咯咯咯

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值