没想到会这么快就过了。。。
但是代码写的很挫。。。还要用_int64...,注意一下输入和输出的时候中间的替换符号的格式即可。
/*因为冒泡排序交换的是两个相邻位置元素,所以冒泡排序的交换次数其实是
元素的逆序数之和*/
/*使用归并排序可以得到逆序数之和,具体的规则是使用当左边中的元素还没有归结完的时候,使用了右边的
元素,这个就是一个逆序*/
#include<iostream>
#define Max 500004
using namespace std;
int i;
__int64 a[Max],righ[Max],lef[Max],count;
void Merge(int p,int q,int r)
{
for (int i=0;i<=q-p;++i)
lef[i]=a[i+p];
for(int j=0;j<=r-q-1;++j)
righ[j]=a[j+q+1];
int li,ri,ai;
li=0;ri=0;ai=p;
while(li<=q-p&&ri<=r-q-1)
{
if(lef[li]<=righ[ri])
a[ai++]=lef[li++];
else
{
count+=q-li+1-p;
a[ai++]=righ[ri++];
}
}
if(li>q-p&&ri>r-q-1)
return;
else if(li>q-p&&ri<=r-q-1)
{
while(ri<=r-q-1)
a[ai++]=righ[ri++];
}
else
{
while(li<=q-p)
a[ai++]=lef[li++];
}
}
void MergeSort(int p,int r)
{
if(p<r)
{
int q=(p+r)/2;
MergeSort(p,q);
MergeSort(q+1,r);
Merge(p,q,r);
}
}
int main()
{
int num;
while (cin >> num&&num!=0)
{
count=0;
int i=0;
while (i<num)
{
scanf("%I64d",&a[i++]);
}
MergeSort(0,num-1);
printf("%I64d\n",count);
}
}