Description
在数组中的两个整数,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
Input
共两行,第一行只有1个数,即数组中数字的个数n;第二行为数组的n个整数,以空格隔开,如:
3
1 2 3
Output
输出为1个数,即所给数组中逆序对的总数
Sample Input 1
3 3 2 1
Sample Output 1
3
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
int tmp[N];
int ans;
void merge_sort(vector<int>& perm, int l, int r)
{
if (l >= r) return;
int mid = l + r >> 1;
merge_sort(perm, l, mid);
merge_sort(perm, mid + 1, r);
int i = l, j = mid + 1, k = 0;
while (i <= mid && j <= r)
{
if (perm[i] <= perm[j])
{
tmp[k++] = perm[i++];
ans+= j - mid - 1;
}
else tmp[k++] = perm[j++];
}
while (i <= mid)
{
tmp[k++] = perm[i++];
ans+= j - mid - 1;
}
while (j <= r) tmp[k++] = perm[j++];
for (int i = l, j = 0; i <= r; i++, j++) perm[i] = tmp[j];
}
int main()
{
int n, a;
cin >> n;
vector<int> perm;
while (n--)
{
cin >> a;
perm.push_back(a);
}
merge_sort(perm, 0, perm.size() - 1);
// for (auto i : perm) cout << i << " ";
cout << ans;
return 0;
}