题目描述
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。
如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。
输入
第1行:N,N为序列的长度(n <= 50000)
第2行:序列中的元素(0 <= A[i] <= 10^9)
第2行:序列中的元素(0 <= A[i] <= 10^9)
输出
输出逆序数
样例输入
4
2 4 3 1
样例输出
4
实际上是归并排序, 顺便求一下逆序数
#include <iostream>
using namespace std;
long long int a[50010], b[50010], temp[50010];
int cnt;
void Merge(int left, int mid, int right)
{
int i = left, j = mid + 1, k = left;
while(i <= mid && j <= right)
{
if(a[i] > a[j])
{
temp[k ++] = a[j ++];
cnt = cnt + mid - i + 1;
}
else
{
temp[k ++] = a[i ++];
}
}
while(i <= mid)
{
temp[k ++] = a[i ++];
}
while(j <= right)
{
temp[k ++] = a[j ++];
}
for(i = left; i <= right; ++ i)
{
a[i] = temp[i];
}
}
void mergeSort(int left, int right)
{
if(left < right)
{
int mid = left + (right - left) / 2;
mergeSort(left, mid);
mergeSort(mid + 1, right);
Merge(left, mid, right);
}
}
int main()
{
int n, m;
cin >> n;
for(int i = 1; i <= n; ++ i)
cin >> a[i];
mergeSort(1, n);
// for(int i = 1; i <= n; ++ i)
// cout << a[i] << " ";
// cout << endl;
cout << cnt << endl;
return 0;
}