как мы можем найти xor элементов массива в диапазоне l, r с заданным числом x, если есть несколько запросов такого типа? - PullRequest
0 голосов
/ 16 января 2020

Для вышеизложенного я прошел через некоторые методы оптимизации запросов, такие как квадратное root разложение, двоичное индексированное дерево, но они не помогают оптимально решить мою проблему. Если кто-нибудь может предложить метод оптимизации запросов, с помощью которого я могу решить эту проблему, пожалуйста, предложите.

1 Ответ

0 голосов
/ 16 января 2020

Вы можете сделать это в постоянное время, используя пробел 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]

Мы используем тот факт, что для любого x, x 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...