当我们进行范围更新时,有人可以帮助我理解二进制索引树 - 为什么我们不更新每个元素为什么只有起始元素和结束元素
我们必须在BIT中为arr [x]更新数组元素范围到arr [y] 。根据二进制索引树点更新功能。它将更新索引x和所有那些索引的累积频率>比通过更新而受影响的x。
但是如果我们使用点更新函数进行范围更新。那么为什么我们不使用点更新函数更新大于x且小于y的每个索引。 由于范围更新意味着每个元素都应该用值更新,更新起始索引和一个以上结束索引如何覆盖所有更新
为什么我们没有这样做
............................................... ...
for (i =[x] to [y])
pointupdate(ar[i],val);// why we are not doing this
update(p, v): //point update
for (; p <= N; p += p&(-p))
ft[p] += v
# Add v to A[a...b]
update(a, b, v): // why we are using this only for update of one element how other elements greater than a will be coverd
update(a, v)
update(b + 1, -v)
我
答案 0 :(得分:0)
更新BIT[a]+=v
时,这意味着对每个索引x>=a
的查询都会看到v
增量。
要以这种方式执行范围更新,请在范围开始时递增v
,在范围结束后递减v
。这意味着只有a
和b
之间的增量才会显示。