排序的同时求逆序数
#include<cstdio>
#include<cstring>
const int maxn = 1e6 +5;
int arr[maxn];
int tmp[maxn];
int cnt = 0;
void merge_arr(int left,int mid,int right)
{
int i = left;
int j = mid + 1;
int np = 0;
while(i <= mid && j <= right){
if(arr[i] < arr[j]){
tmp[np] = arr[i];
np++;
i++;
}
else {
tmp[np] = arr[j];
cnt += mid - i + 1;
np++;
j++;
}
}
while(i <= mid){
tmp[np] = arr[i];
np++;
i++;
}
while(j <= right){
tmp[np] = arr[j];
np++;
j++;
}
for(int i = 0; i < np; i ++){
arr[left + i] = tmp[i];
}
}
void merge_sort(int left, int right){
if(left < right){
int mid = (left +right) / 2;
merge_sort(left, mid);
merge_sort(mid + 1, right);
merge_arr(left, mid, right);
}
}
int main()
{
int n;
while(~scanf("%d",&n)){
cnt = 0;
for(int i = 0; i < n; i ++){
scanf("%d",&arr[i]);
}
merge_sort(0,n - 1);
for(int i = 0; i < n; i ++){
printf("%d ",arr[i]);
}
printf("\n");
printf("%d\n",cnt);
}
}