Задачата е следната:
Трябва да се намери броя на инверсиите в дадена пермутация.
Иначе казано, трябва да намеря броя на разместваният, които трябва да се направят, за сведем това
0 4 2 1 3
до това
0 1 2 3 4
В дадения пример инверсиите са 4.
И тук идва интересната част. Всичко това трябва да става максимално бързо. Това, което направих е да използвам Insertion sort и да броя всички промени, които той прави с един flag. Проблемът е, че времето е незадоволително. Трябва да го сведа от сегашните близо 3 секунди на 1-2. Ето какво измайсторих до момента:
Ще се надявам да предложите нещо.
Може и с друг алгоритъм за сортиране, вероятно, въпросът е да мога да преброя инверсиите правилно за отрицателно време. 
Трябва да се намери броя на инверсиите в дадена пермутация.
Иначе казано, трябва да намеря броя на разместваният, които трябва да се направят, за сведем това
0 4 2 1 3
до това
0 1 2 3 4
В дадения пример инверсиите са 4.
И тук идва интересната част. Всичко това трябва да става максимално бързо. Това, което направих е да използвам Insertion sort и да броя всички промени, които той прави с един flag. Проблемът е, че времето е незадоволително. Трябва да го сведа от сегашните близо 3 секунди на 1-2. Ето какво измайсторих до момента:
Код:
#include<iostream>
#include<cstdio>
int main() {
int n;
do {
scanf("%d",&n);
} while(n < 1 || n > 2000000);
int *arr = new int[n];
for(int i = 0; i < n; i++)
scanf("%d", &*(arr + i));
// Insertion sort
int flag = 0;
for(int i = 1; i < n; i++) {
int index = *(arr + i);
int dec = i;
while(dec > 0 && *(arr + dec - 1) >= index) {
*(arr + dec) = *(arr + dec - 1);
--dec;
flag++;
}
*(arr + dec) = index;
}
printf("%d", flag);
return 0;
}