Я сделаю удар. Мы будем рассматривать запросы в порядке убывания, поэтому от i = N-1, ... до 0. Прежде всего, обратите внимание, что когда мы сжимаем все A [j]> i в i, любой A [j] = я больше не буду вызывать инверсию с элементами больше, чем у него с меньшим индексом.
Например, скажем, у нас есть A = [1, 2, 5, 4] и мы уменьшаем A [2] до 4. Тогда у нас есть A = [1, 2, 4, 4] и наш единственный инверсия исчезает. Таким образом, для каждого j мы можем посчитать количество элементов в A с меньшим индексом и большим значением, и обозначить это V [j], «количество инверсий, которые оно вносит». Мы находим общее число инверсий в исходном массиве, а затем для каждого i = N-1, ..., 0 мы удаляем V [j] из общего числа инверсий для всех j таких, что V [j] = i .
Давайте применим это к приведенному примеру.
A = [3, 2, 1, 5, 2, 0, 5]
V = [0, 1, 2, 0, 2, 5, 0]
Затем, пройдя через i = 6, 5, 4, 3, 2, 1:
i = 6: A = [3, 2, 1, 5, 2, 0, 5], res = 10 (original calculation using merge sort)
i = 5: A = [3, 2, 1, 5, 2, 0, 5], res = 10 (subtract nothing because V[3] = V[6] = 0)
i = 4: A = [3, 2, 1, 4, 2, 0, 4], res = 10 (subtract nothing because no occurrences of 4)
i = 3: A = [3, 2, 1, 3, 2, 0, 3], res = 10 (10 - V[0] = 10)
i = 2: A = [2, 2, 1, 2, 2, 0, 2], res = 7 (10 - V[1] - V[4] = 10 - 1 - 2 = 7)
i = 1: A = [1, 1, 1, 1, 1, 0, 1], res = 5 (7 - V[2] = 7 - 2 = 5)
i = 0: A = [0, 0, 0, 0, 0, 0, 0], res = 0 (5 - V[5] = 5 - 5 = 0)
И мы получаем желаемые результаты. Детали реализации могут отличаться; Вы можете найти число элементов больше, чем A [j] с меньшим индексом, используя Fenwick Tree или что-то подобное. Этот алгоритм выполняется за время O (NlogN).