Сегодня я смотрел последний экзамен на местной олимпиаде по информатике и обнаружил интересную проблему.Вкратце, он просит, учитывая массив целых чисел, подсчитать, сколько у него инверсий, где инверсия - это пара признаков i
, j
, таких как i > j
и A[i] < A[j]
.Неформально количество инверсий - это количество пар, которые не в порядке.Первоначально я принял решение O(n²)
(да, наивное), но, увидев, что оно не подходит под размер ввода, я немного подумал о проблеме, а потом понял, что это можно сделать в O(n log n)
время по варианту сортировки слиянием, которая хорошо обрабатывает размер ввода.
Но, учитывая ограничения ввода (n
целые числа между 1 and M
и без дубликатов), мне было интересно, если мойрешение является оптимальным, или вы знаете, есть ли другое решение этой проблемы, которое превосходит O(n log n)
время выполнения?