我已经阅读了有关二进制索引树的一些教程,但是当查询和更新两个操作都在某个范围内时,我无法理解如何实现它。
答案 0 :(得分:0)
要实现范围更新和范围查询,您需要了解范围更新和点查询(使用v更新[a,b];查询(x)给出A [x]处的值)。
我们将使用两个BIT来实现范围更新和范围查询。
让我们说数组初始化为0.如果我们用v更新[a,b],
For some x, sum(0,x) = 0 if 0 < x < a
= v*(x - (a-1)) if a <= x <= b
= v * (b - (a-1)) if b < x
where v is the value at A[x] (calculated via BIT1)
从上面的公式中,我们找到T,当从v * x中减去(v从BIT1计算得出)时,我们得到结果。
if 0 < x < a : sum(0,x) = 0, T = 0
a <= x <= b: sum(0,x) = v*x - v*(a-1) , T = v*(a-1)
b < x : sum(0,x) = v*(b-a+1) , T = -v*(b-(a-1)) (since A[x] = 0 when x > b)
We store T in second BIT (BIT2)
现在,用v:
实现更新[a,b]update(a,v) ; update(b+1,-v) in BIT1 and
update(a,v*(a-1)); update(b+1,-v*b) in BIT2
和[0,x]中:
QueryBIT1(x)*x - QueryBIT2(x); // call query() on corresponding BIT
其中,update(index,value)和Query(index)是用于点更新和范围查询的实现。
更多细节:
http://zobayer.blogspot.in/2013/11/various-usage-of-bit.html https://kartikkukreja.wordpress.com/2013/12/02/range-updates-with-bit-fenwick-tree/