歸併排序,主要是,題目可轉換爲求逆序數的問題
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
long long a[500010],b[500010];
long long cnt;
void merge(int l,int r,int mid)
{
int il=l;
int ir=mid+1;
int k=l;
while(il<=mid&&ir<=r)
{
if(a[il]<a[ir])
{
b[k++]=a[il];
il++;
}
else
{
b[k++]=a[ir];
ir++;
cnt+=(mid-il+1);
}
}
while(il<=mid)b[k++]=a[il++];
while(ir<=r)b[k++]=a[ir++];
for(int i=l;i<=r;i++)
a[i]=b[i];
}
void mergesort(int l,int r)
{
if(l<r)
{
int mid=(l+r)/2;
mergesort(l,mid);
mergesort(mid+1,r);
merge(l,r,mid);
}
return;
}
int main()
{
int n;
while(cin>>n&&n)
{
for(int i=1;i<=n;i++)
cin>>a[i];
cnt=0;
mergesort(1,n);
cout<<cnt<<endl;
}
return 0;
}