题目
解析
此题本质上就是一个求逆序对的问题
#include <iostream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <functional>
#include <unordered_set>
#include <set>
#include <bitset>
#include <cstdio>
using namespace std;
const int N = 1e6 + 1;
int nums[N], temp[N];
int n;
using ll = long long;
// 归并排序基本模版
inline ll mergeSort(int nums[], int l, int r) {
if (l >= r) return 0;
int mid = l + r >> 1;
ll res = mergeSort(nums, l, mid) + mergeSort(nums, mid + 1, r);
int i = l, j = mid, k = 0;
while (i <= mid && j <= r) {
if (nums[i] > nums[j]) {
// 第一个有序序列中从i开始到mid的数都要和nums[j]形成逆序对
res += mid - i + 1;
temp[k++] = nums[j++];
} else {
temp[k++] = nums[i++];
}
while (i <= mid) temp[k++] = nums[i++];
while (j <= r) temp[k++] = nums[j++];
for (i = l, j = 0; i <= r; i++, j++) {
nums[i] = temp[j];
}
return res;
}
}
int main() {
ios::sync_with_stdio(false);
while (cin >> n, n) {
memset(nums, 0, sizeof(nums));
for (int i = 1; i <= n; i++) cin >> nums[i];
// 本质上是一个求逆序对的问题
cout << mergeSort(nums, 1, n) << endl;
}
return 0;
}