找到除索引L到R之外的数组的所有元素的总和

时间:2015-01-06 07:39:10

标签: c++ arrays algorithm data-structures segment-tree

我们有一个数组arr[0 . . . n-1]。我们应该能够

  1. 求索从索引L到R的元素之和,其中0 <= L <= R <= n-1。
  2. 更改数组arr[i] = x的指定元素的值,其中0 <= i&lt; = n-1。
  3. 这可以使用段树有效地解决。

    但如何解决与此相反的问题

    1. 找到从索引0到n-1的所有元素(arr [i])的总和,不包括L&lt; = i&lt; = R,其中给出L和R.
    2. 更改array arr[i] = x指定元素的值,其中0&lt; = i&lt; = n-1。
    3. 如何像分段树一样有效地解决上述问题?

1 个答案:

答案 0 :(得分:1)

假设您可以使用分段树轻松计算总和(L,R)。

首先,计算整个数组的总和,称为total

对于位置arr的更改

  • 照常更新细分树。

  • 更新total = total - oldValue + newValue

对于每个查询,请打印total - sum(L,R)

注意:我们也可以使用binary indexed tree(a.k.a Fenwick tree)来解决这个问题,哪种IMO更适合。