用归并排序求逆序数。
http://blog.csdn.net/dlengong/article/details/7594919
http://blog.csdn.net/sevenmit/article/details/9081831
#include<stdio h="">
#include<string h="">
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
int a[1000005];
int b[1000005];
long long ans;
void m(int a[],int first,int mid,int last)
{
int i=first,j=mid+1;
int cur=first;
while(i<=mid&&j<=last)
{
if(a[i]<=a[j])
{
b[cur++]=a[i++];
}
else
{
ans+=(j-cur);
b[cur++]=a[j++];
}
}
while(i<=mid)
{
b[cur++]=a[i++];
}
while(j<=last)
{
b[cur++]=a[j++];
}
for(int i=first;i<=last;i++)
{
a[i]=b[i];
}
}
void msort(int a[],int first,int last)
{
if(first==last)
return;
int mid=(first+last)/2;
msort(a,first,mid);
msort(a,mid+1,last);
m(a,first,mid,last);
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
ans=0;
msort(a,1,n);
cout<<ans<<endl;
}
}