【题目描述】
给定一个序列a1,a2,…,an,如果存在 i < j 并且 ai > aj ,那么我们称之为逆序对,求逆序对的数目。
【输入】
第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。
【输出】
所有逆序对总数。
【输入样例】
4
3
2
3
2
【输出样例】
3
【提示】
N≤10^6,Ai≤10^6。
#include <iostream>
using namespace std;
long long merge(int arr[], int temp[], int low, int mid, int high) {
int i = low, j = mid + 1, k = low;
long long count = 0;
while (i <= mid && j <= high) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
count += mid - i + 1;
}
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= high) {
temp[k++] = arr[j++];
}
for (int x = low; x <= high; ++x) {
arr[x] = temp[x];
}
return count;
}
long long mergeSort(int arr[], int temp[], int low, int high) {
if (low >= high) {
return 0;
}
int mid = low + (high - low) / 2;
long long count = 0;
count += mergeSort(arr, temp, low, mid);
count += mergeSort(arr, temp, mid + 1, high);
count += merge(arr, temp, low, mid, high);
return count;
}
int main() {
int n;
cin >> n;
int arr[n];
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
int temp[n];
long long result = mergeSort(arr, temp, 0, n - 1);
cout << result << endl;
return 0;
}