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

Posted ymir-taomee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状数组的改段求点,改段求段相关的知识,希望对你有一定的参考价值。


 

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

 用一个数组 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 数组对应做单点修改即可.

以上是关于树状数组的改段求点,改段求段的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1556 数据结构-树状数组-改段求点

HDU 1556 线段树或树状数组,插段求点

sql 通过某段时间求得改段时间内的工作时长,排除工作日

改段字就能查询任意书籍销量,31行代码爬取京东书籍畅销榜

改段字就能查询任意书籍销量,31行代码爬取京东书籍畅销榜

用MATLAB编写一段求分布函数图像及数学期望的程序