Блог пользователя ironsoul

Автор ironsoul, 8 лет назад, По-русски

Дана последовательность из N чисел, где N <= 1e5.

Нужно найти сумму всех a[i] xor a[j], что i < j и a[i] > a[j].

Я так понял эта задача решается деревом Фенвика, но как искать не количество инверсий, а их сумму?

Есть ли у операции xor такое свойство?

(a xor b) + (a xor c) = a xor (b + c)

Спасибо

  • Проголосовать: нравится
  • +17
  • Проголосовать: не нравится

»
8 лет назад, # |
  Проголосовать: нравится -28 Проголосовать: не нравится

Как ты стал синим ?

»
8 лет назад, # |
  Проголосовать: нравится +40 Проголосовать: не нравится

Для того, чтобы сделать это, тебе понадобится не одно, a log(max_Ai)+1 деревьев Фенвика — по одному на каждый бит и еще одно обычное.
Как для числа a[i] посчитать сумму a[i] xor a[j], для j < i и a[j] > a[i]:
Рассматриваем бит x. Если в a[i] он равен 0, в xor-е он будет 1, если в a[j] 1. Поэтому нужно взять x-ое дерево Фенвика и посчитать количество в нем чисел, больших a[i]. Пусть это количество С. Тогда к сумме нужно прибавить (2^x)*C.
Если же в a[i] x-ый бит равен 1, то нужно прибавить к сумме (2^x)*(T-C), где Т — общее количество чисел, больших a[i] (именно для этого нужно дополнительное дерево).
После того, как мы добавили к сумме необходимые значения, нужно запомнить число A[i]. Проходимся по битам, добавляем в соответствующее дерево только если бит равен 1. И добавляем в общее дерево.

»
8 лет назад, # |
  Проголосовать: нравится -16 Проголосовать: не нравится

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

А можно ссылку на задачу, если не трудно?)

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Эта задача была у нас на сетевой олимпиаде, остались только условия(