题目链接:点击打开链接
Description

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
题目大意:给数一数字序列,按递增排序,两个相邻的做交换,交换几次
ps:一看就是冒泡排序的步骤,但是会超时,;
这里用归并排序求逆序数(离散中讲过),逆序数就是它的交换次数(不要问为什么,模拟几个例子就知道了)
<span style="font-size:18px;">#include <iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
int a[500100];
int aux[500100];
long long ans;
void compute(int a[],int l,int mid,int r)
{
for(int i=l;i<=r;i++)
{
aux[i]=a[i];
}
int i=l;
int j=mid+1;
for(int k=l;k<=r;k++)
{
if(i>mid)a[k]=aux[j++];
else if(j>r)a[k]=aux[i++];
else if(aux[i]<aux[j])a[k]=aux[i++];
else
{
a[k]=aux[j++];
ans+=mid-i+1;
}
}
}
void mergesort(int a[],int l,int r)
{
if(l<r)
{
int mid=(l+r)/2;
mergesort(a,l,mid);
mergesort(a,mid+1,r);
compute(a,l,mid,r);
}
}
int main()
{
int n;
while(scanf("%d",&n),n)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
ans=0;
mergesort(a,1,n);
printf("%lld\n",ans);
}
return 0;
}
</span>