码迷,mamicode.com
首页 > 编程语言 > 详细

树状数组的改段求点,改段求段

时间:2018-12-15 21:09:56      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:log   +=   区间修改   blog   nbsp   一个   差分   4.6   数组   


 

改段求点(区间更新, 单点求值)

 用一个数组 d 存储目标数组 a 中相邻元素的差值, 即 i > 1 时, d[i] = a[i] - a[i - 1] ; i == 1 时, d[i] = a[i] .

那么有 a[i] = d[1] + ... + d[i] .若要将 a 数组区间 [l, r] 的元素都加上 key, 显然只需令 d[l] += key, d[r + 1] -= key 即可.

显然只要用树状数组维护一下 d 数组即可.


 

改段求段(区间更新,区间求值)

与上面类似, 先开一个差分数组 d

那么有:

a1 + a2 + ... + an

= d1 + (d1 + d2) + ... + (d1 + d2 + ... + dn)

= n * d1 + (n - 1) * d2 + ... + dn

= n * (d1 + d2 + ... + dn) - (0 * d1 + 1 * d2 + ... (n - 1) * dn)

再令 c[i] = ( i - 1) * di

那么原式可化简为:

 n * (d1 + d2 + ... + dn) - (c1 + c2 + ... cn)

显然对于 d 和 c 数组求和可以用树状数组解决. 而由 2 可知 a 数组区间修改则只需要对 d 和 c 数组对应做单点修改即可.

树状数组的改段求点,改段求段

标签:log   +=   区间修改   blog   nbsp   一个   差分   4.6   数组   

原文地址:https://www.cnblogs.com/Ymir-TaoMee/p/10124403.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!