例如被告知索引-i 的函数或f(i) 的值是i ^ k,对于k> = 0 并且始终停留在这个问题上。给定如下查询:
添加值数组[i],对于所有a <= i <= b 作为v 确定总数组[i] f(i),对于每个a <= i <= b(记得前面函数值的说明)
To work on this matter, can be formed into Query (x) = m * g (x) - c,
where g (x) is f (1) + f (2) + ... + f (x).
要做到这一点,我们需要知道 m 和 c 的值。为此,我们需要 2 个单独的 BIT。下面观察以 ab v 的形式对每个更新进行观察。要计算 m 的值,实际上与 Range Update - Point Query 相同。对于 i 的每个值,我们可以得到以下观察结果,可能是:
i <a, m = 0
a <= i <= b, m = v
b <i, m = 0
通过使用以下观察,很明显范围更新 - 点查询可用于任何 BIT。要计算 c 的值,我们需要观察每个 i 值的可能性,可能是:
i <a, then c = 0
a <= i <= b, then c = v * g (a - 1)
b <i, c = v * (g (b) - g (a - 1))
同样,我们需要范围更新 - 点查询,但在不同的 BIT 中。Oiya,为了一点帮助,我为 k <= 3 写了 g (x) 的值是:p:
k = 0 -> x
k = 1 -> x * (x + 1) / 2
k = 2 -> x * (x + 1) * (2x + 1) / 6
k = 3 -> (x * (x + 1) / 2) ^ 2
现在,示例问题 SPOJ - Horrible Queries 。这个问题与所描述的问题类似,k = 0。还要注意,有时有一个非常极端的问题,该函数不是针对一种类型的 k,但它可能是多项式的形状!例如 LA 外星人再次绑架。为了解决这个问题,解决方案是,对于每个等级,我们分别制作其 BIT 计数器 m。BIT结合清除计数器c很好。
如果出现以下情况,我们如何使用这个概念:
给定一个整数数组 A1,A2,...AN。
给定 x,y:将 1×2 加到 Ax,将 2×3 加到 Ax+1,将 3×4 加到 Ax+2,将 4×5 加到 Ax+3,依此类推,直到 Ay。
然后返回范围 [Ax,Ay] 的总和。