改段求点(区间更新, 单点求值)
用一个数组 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 数组对应做单点修改即可.
原文地址:https://www.cnblogs.com/Ymir-TaoMee/p/10124403.html
时间: 2024-11-06 03:36:21