采用归并排序的思想
在对两个排好序的区间进行合并时,如果左边区间的数大于右边区间的数那么就出现了逆序对,计算一下从这个数的位置到区间最后还有几个数,这些数都是可以和右区间的数组成逆序对的。然后就看代码吧
#include <iostream> using namespace std; const int maxn = 100010; int arr[maxn]; int nums[maxn]; long long res = 0; void merge(int l, int mid, int r) { int p1 = l; int p2 = mid + 1; for (int i = l; i <= r; i++) { if ((p1 <= mid) && ((p2 > r) || arr[p1] <= arr[p2])) { nums[i] = arr[p1]; p1++; } else { nums[i] = arr[p2]; p2++; res += mid - p1 + 1;//从这个数的位置到区间最后还有几个数 } } for (int i = l; i <= r; i++) { arr[i] = nums[i]; } } void erfen(int l, int r) { int mid = (l + r) / 2; if (l < r) { erfen(l, mid); erfen(mid + 1, r); } merge(l, mid, r); } int main() { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> arr[i]; } erfen(0, n - 1); cout << res; }