如果有多个此类查询,我们如何在给定数字 x 的范围内找到数组元素的 xor ?



对于上述问题,我经历了一些查询优化技术,如平方根分解、二元索引树,但它们无助于以最佳方式解决我的问题。如果有人可以建议一种查询优化技术,通过它我可以解决这个问题,请提出建议。

您可以使用O(n)空间在恒定时间内执行此操作,其中n是数组的大小。最初的建设需要O(n).
给定一个数组A,你首先需要构建数组XOR-A,这样:

XOR-A[0] = A[0]
For i from 1 to n-1:
XOR-A[i] = XOR-A[i-1] xor A[i]

然后,您可以回答范围(l,r(上的查询,如下所示:

get_xor_range(l, r, XOR-A):
return XOR-A[l-1] xor XOR-A[r]

我们使用的事实,对于任何xx xor x = 0。这就是这里工作的原因。

编辑:对不起,我一开始没有很好地理解这个问题。
这是一种在O(m + n)时间和O(n)空间内更新数组的方法,其中n是数组的大小,m查询数。
表示法:数组是A的,大小n,查询是(l_i, r_i, x_i), 0 <= i < m

L <- array of tuple (l_i, x_i) sorted in ascending order by the l_i 
R <- array of tuple (r_i, x_i) sorted in ascending order by the r_i
X <- array initialised at 0 everywhere, of size `n`
idx <- 0
l, x <- L[idx]
for j from 0 to n-1 do:
while l == j do:
X[j] <- X[j] xor x
idx ++
l, x <- L[idx]
if j < n then X[j+1] <- X[j]
idx <- 0
r, x <- R[idx]
for j from 0 to n-1 do:
while r == j do:
X[j] <- X[j] xor x
idx ++
r, x <- R[idx]
if j < n then X[j+1] <- X[j]
for j from 0 to n-1 do:
A[j] <- A[j] xor X[j]

最新更新