题目描述
此题和poj 1804一样都是求逆序对数,但是此题数据规模较大,只能采取归并排序中求逆序对数目,否则会超时。
#include<iostream>
using namespace std;
const int maxn=500005;
int a[maxn];
int temp[maxn];
int n;
long long ans;
void Merge(int r[],int temp[],int s,int m,int t){
int i=s;
int j=m+1;
int k=i;
while(i<=m&&j<=t){
if(r[i]<=r[j])
temp[k++]=r[i++];
else{
temp[k++]=r[j++];
ans+=m+1-i;
}
}
while(i<=m)
temp[k++]=r[i++];
while(j<=t)
temp[k++]=r[j++];
for(i=s;i<=t;i++)
r[i]=temp[i];
}
void MergeSort(int r[],int temp[],int s,int t){
if(s==t)
return;
else{
int m=(s+t)/2;
MergeSort(r,temp,s,m);
MergeSort(r,temp,m+1,t);
Merge(r,temp,s,m,t);
}
}
int main(){
while(cin>>n){
ans=0;
if(n==0)
break;
for(int i=1;i<=n;i++)
cin>>a[i];
MergeSort(a,temp,1,n);
cout<<ans<<endl;
}
}