这个问题可以使用归并排序的思想来解决。在归并排序的过程中,我们可以统计逆序数的数量。当我们合并两个已经排序的数组时,如果左边的数组中的元素��于右边的数组中的元素,那么就存在逆序,逆序数的数量就是左边的数组中的元素到数组末尾的距离。
以下是C++代码实现:
#include <iostream>
#include <vector>
using namespace std;long long mergeSort(vector<int>& arr, vector<int>& temp, int left, int right) {if (left >= right) {return 0;}int mid = left + (right - left) / 2;long long invCount = mergeSort(arr, temp, left, mid) + mergeSort(arr, temp, mid + 1, right);int i = left, j = mid + 1, k = left;while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];invCount += mid - i + 1;}}while (i <= mid) {temp[k++] = arr[i++];}while (j <= right) {temp[k++] = arr[j++];}for (i = left; i <= right; i++) {arr[i] = temp[i];}return invCount;
}int main() {int n;cin >> n;vector<int> arr(n);for (int i = 0; i < n; i++) {cin >> arr[i];}vector<int> temp(n);long long invCount = mergeSort(arr, temp, 0, n - 1);cout << invCount << endl;return 0;
}
在这段代码中,我们首先读取输入的n和arr,然后初始化一个临时数组temp。然后我们调用mergeSort函数,传入arr、temp、0和n - 1作为参数,这个函数会返回arr的逆序数。最后,我们输出逆序数。