Я участвовал в конкурсе по программированию, в котором я не смог решить проблему, проблема заключалась в следующем:
Учитывая массив A из n целых чисел, мне нужно подсчитать количество инверсий в заданных диапазонах. Предложено целое число m, которое сообщает количество диапазонов, затем следуют m строк, в каждой строке указаны два целых числа li и ri.
Мы должны подсчитывать инверсии только в заданном диапазоне, то есть от li до ri включительно (индексирование на основе 0).
Два элемента A [i] и A [j] добавляют к инверсии, если A[i]>A[j]
и i<j
.
например: A=[3 2 1 4]
Инверсии:
(2, 1), (3, 1), (3, 2) i.e. total number of inversions are 3.
Ввод:
3 2 1 4 //Array A
3 // m - no. of ranges
1 2 // range
2 3
0 3
Вывод:
1
0
3
Ограничения:
n<=2*10^4
m<=2*10^4
A[i]<=10^9
Я знаю методы вычисления счетчика инверсии в O (nlogn) (например, BIT или сортировка слияния) для всего массива, и если я применяю то же самое здесь к каждому диапазону, то сложность будет O (mnlogn), что, безусловно, неприемлемо как время предел составляет 1 секунду.