题目链接:点击打开链接
大意:是逆序数,不过求的是有多少个逆序对;
如 3 2 4 1
有 4 个逆序对:(3,2),(3,1),(2,1),(4,1);
#include<iostream>
#include<algorithm>
using namespace std;
long long sum;
void merge(int a[],int s,int mid,int e)
{
int *q=new int[e-s+1];//开辟一个大小为e-s+1的无名空间;
int k=0;
int i=s,j=mid+1;
while(i<=mid&&j<=e)
{
if(a[i]<=a[j]) q[k++]=a[i++];
else q[k++]=a[j++],sum+=(mid-i+1);
}
while(i<=mid) q[k++]=a[i++];
while(j<=e) q[k++]=a[j++];
k=0;
i=s;
while(i<=e) a[i++]=q[k++];
delete q;
}
void mergesort(int a[],int s,int e)
{
if(s==e) a[s]=a[e];
else
{
int mid=(s+e)/2;
mergesort(a,s,mid);
mergesort(a,mid+1,e);
merge(a,s,mid,e);
}
}
int main()
{
int n;
int A[500009];
while(cin>>n,n)
{
int i;
sum=0;
for(i=0; i<n; i++)
cin>>A[i];
mergesort(A,0,n-1);
cout<<sum<<endl;
}
return 0;
}