3

http://ayazdzulfikar.blogspot.in/2014/12/penggunaan-fenwick-tree-bit.html?showComment=1434865697025#c5391178275473818224

例如被告知索引-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] 的总和。

4

0 回答 0