在整数数组(大小为10 ^ 5)中,操作就像这些......
如何使用分段树和延迟传播?
答案 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),你会得到一个错误的答案,因为更新只改变了根节点。