本题的主要思路是,在归并排序的回溯过程中进行逆序对的统计。因为在回溯的过程中,A[l...p]和A[p...r]分别都是有序的,所以在A[l...p]中的元素x比A[p...r]中的某个元素y大时,x...p的元素都比y大。举个例子:
#include <cstdio>
using namespace std;
const int N = 100010;
int n;
long long res = 0;
int arr[N];
void getAns(int left, int right) {
if(left >= right) return;
int mid = left + ((right - left) >> 1);
getAns(left, mid);
getAns(mid + 1, right);
int tmp[right - left + 1];
int i = left, j = mid + 1, idx = 0;
while(i <= mid && j <= right) {
if(arr[i] > arr[j]) {
res += (mid - i + 1);
tmp[idx++] = arr[j++];
} else
tmp[idx++] = arr[i++];
}
while(i <= mid) tmp[idx++] = arr[i++];
while(j <= right) tmp[idx++] = arr[j++];
for(int x = left; x <= right; ++x) arr[x] = tmp[x - left];
}
int main() {
scanf("%d", &n);
for(int i = 0; i < n; ++i) scanf("%d", &arr[i]);
getAns(0, n-1);
printf("%ld\n", res);
return 0;
}