段树:延迟传播

时间:2012-11-11 17:04:31

标签: algorithm data-structures segment-tree

在整数数组(大小为10 ^ 5)中,操作就像这些......

  1. 对索引L到R中的每个元素按特定数字X
  2. 执行按位xor运算
  3. 查找索引L到R的数字之和。
  4. 如何使用分段树和延迟传播?

2 个答案:

答案 0 :(得分:1)

我会在每个节点上保留32个整数,告诉我子节点的二进制表示的每个位置有多少个整数。

要对一个段节点进行异或,只需要反转每个位置有多少个(对于X中的每个位1)。

for i in range(32):
    if X&(1<<i):
        N[i] = (R-L+1)-N[i]. 

计算总和,

s = 0
for i in range(32):
    s |= ((N[i]+carry)%2) << i
    carry = (N[i]+carry)/2

答案 1 :(得分:1)

你的答案不正确。你需要做一些类似于懒惰的更新:http://p--np.blogspot.ro/2011/07/segment-tree.html。否则,如果你更新(1,n,x)和查询(4,5),你会得到一个错误的答案,因为更新只改变了根节点。