模版题目:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 100010;
int n;
int a[N], tmp[N];
ll merge_sort(int l, int r)
{
if (l >= r) return 0;
int mid = l + r >> 1;
ll res = 0;
res = merge_sort(l, mid) + merge_sort(mid+1, r);
int i = l, j = mid + 1, k = 1;
while (i <= mid && j <= r)
{
if (a[i] <= a[j]) tmp[k++] = a[i++]; //少了等号会导致相同的数也被计算了数对
else tmp[k++] = a[j++], res += mid - i + 1;
}
while (i <= mid) tmp[k++] = a[i++];
while (j <= r) tmp[k++] = a[j++];
for (int i = l, j = 1; i <= r; i++, j++) a[i] = tmp[j];
return res;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++) scanf("%d", &a[i]);
cout << merge_sort(1, n) << endl;
return 0;
}
注意:相同的数并不能当做逆序对加入res中,在归并while中要注意等号