Description
![](https://i-blog.csdnimg.cn/blog_migrate/b3530eaa8fa98ef394d3639722240a8c.jpeg)
Ultra-QuickSort produces the output
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Input
The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
Output
For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
题意:给一组数,求这组数的逆序数。逆序数:对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序。一个排列中所有逆序总数叫做这个排列的逆序数。例如9 1 0 5 4的逆序数为4+1+1+0=6。
用归并排序可以计算逆序数。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std;
long long ans;
int arr[500010],t[500010];
void mergearray(int a[],int l,int mid,int r)
{
int i=l,j=mid+1;
int k=l;
while (i<=mid&&j<=r)
{
if(a[i]<=a[j])
t[k++]=a[i++];
else{
t[k++]=a[j++];
ans += mid-i+1;
}
}
while (i<=mid)
t[k++]=a[i++];
while (j<=r)
t[k++]=a[j++];
for (int i=l;i<=r;i++)
a[i]=t[i];
}
void msort(int a[],int l,int r)
{
if (l<r)
{
int mid=(l+r)/2;
msort(a,l,mid);
msort(a,mid+1,r);
mergearray(a,l,mid,r);
}
}
int main()
{
int n;
while (scanf("%d",&n),n)
{
ans=0;
for (int i=1;i<=n;i++)
{
scanf("%d",&arr[i]);
}
msort(arr,1,n);
printf("%lld\n",ans);
}
return 0;
}