昨天做了poj2299,复习了归并排序!!!
#define max 500000 后没有分号啊
还有结果会超int32所以要用__int64 是两个横线,醉了。。。
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAX 500000
__int64 cnt=0;
int b[MAX],a[MAX];
void merge(int a[],int start,int mid,int end)
{
int i=start,j=mid+1,k=start;
while(i<=mid&&j<=end)
{
if(a[i]<=a[j])
b[k++]=a[i++];
else
{ b[k++]=a[j++];
cnt+=j-k;//相当于数往前挪了几个位置,就是逆序数
}
}
while(i<=mid)
{//表示j已到达最后一个值
b[k++]=a[i++];
}
while(j<=end)
{
b[k++]=a[j++];
}
for(int i=start;i<=end;i++)
a[i]=b[i];
}
void mergesort(int *a,int start,int end){
if(start<end){
int mid=(start+end)/2;
mergesort(a,start,mid);
mergesort(a,mid+1,end);
merge(a,start,mid,end);
}
return;
}
int main(void){
int n;
while (1)
{
cnt=0;
cin>>n;
if(n==0)
break;
for(int i=0;i<n;i++)
cin>>a[i];
mergesort(a,0,n-1);
cout<<cnt<<endl;
}
system("pause");
return 0;
}