Дана последовательность из 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)
Спасибо
Как ты стал синим ?
Для того, чтобы сделать это, тебе понадобится не одно, 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. И добавляем в общее дерево.
А можно ссылку на задачу, если не трудно?)
Эта задача была у нас на сетевой олимпиаде, остались только условия(