题目地址:http://poj.org/problem?id=2299
参考地址:http://blog.csdn.net/lyy289065406/article/details/6647346
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
#define INF 1000000000
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a>b?b:a
#define N 500005
ll ans;
void solve(int a[],int st,int mid,int end)
{
int len_L=mid-st+1;
int len_R=end-mid;
int* left=new int[len_L+2];
int* right=new int[len_R+2];
int i,j;
for(i=1;i<=len_L;i++)
left[i]=a[st+i-1];
left[len_L+1]=INF; //设置无穷上界,避免比较大小时越界
for(j=1;j<=len_R;j++)
right[j]=a[mid+j];
right[len_R+1]=INF; //设置无穷上界,避免比较大小时越界
i=j=1;
for(int k=st;k<=end;)
if(left[i]<=right[j])
a[k++]=left[i++];
else
{
a[k++]=right[j++];
ans+=len_L-i+1; //计算逆序数
}
delete left;
delete right;
return;
}
void mergesort(int a[],int st,int end)
{
if(st<end)
{
int mid=(st+end)/2;
mergesort(a,st,mid);
mergesort(a,mid+1,end);
solve(a,st,mid,end);
}
return ;
}
int main()
{
int n;
int a[N];
while(scanf("%d",&n)!=-1&&n)
{
ans=0;
for(int i=1;i<=n;i++)
cin>>a[i];
mergesort(a,1,n);
printf("%I64d\n",ans);
}
return 0;
}