原题地址:点击打开链接
题意:就是问你逆序对的个数,用冒泡会超时,所以用归并。
#include<stdio.h>
int a[500010];
int b[500010];
long long res=0;
void merge(int l1,int r1,int l2,int r2)
{
int begin=l1,end=r2,low=l1;
while(l1<=r1&&l2<=r2)
{
if(a[l1]<a[l2])
{
b[begin]=a[l1];
begin++;
l1++;
}
else
{
b[begin++]=a[l2++];
res+=(r1-l1+1);
}
}
while(l1<=r1) b[begin++]=a[l1++];
while(l2<=r2) b[begin++]=a[l2++];
while(low<begin)
{
a[low]=b[low];
low++;
}
}
void mSort(int left,int right)
{
if(left==right)
return ;
int mid=(left+right)/2;
mSort(left,mid);
mSort(mid+1,right);
merge(left,mid,mid+1,right);
}
int main()
{
int n,i;
while(scanf("%d",&n)&&n)
{
res=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
mSort(0,n-1);
printf("%lld\n",res);
}
return 0;
}