您的位置:首页 > 其它

poj解题报告——2299

2015-01-11 15:02 405 查看
题目本质就是求逆序对,然后用归并排序就可以做了,冒泡也能做,但是超时,O(n^2)的算法相比于O(n*log(n))算法总是要差一点的。

代码如下

#include<stdio.h>

#include<stdlib.h>

#define MAX 500001

int n,a[MAX],t[MAX];

__int64 sum;

void Merge(int l, int m, int r)

{

int p=0;

int i=l,j=m+1;

while(i<=m&&j<=r)

{

if(a[i]>a[j])

{

t[p++]=a[j++];

sum+=m-i+1;

}

else

{

t[p++]=a[i++];

}

}

while(i<=m)

t[p++]=a[i++];

while(j<=r)

t[p++]=a[j++];

for(i=0;i<p;i++)

{

a[l+i]=t[i];

}

}

void MergeSort(int l,int r)

{

int m;

if(l<r)

{

m=(l+r)/2;

MergeSort(l,m);

MergeSort(m+1,r);

Merge(l,m,r);

}

}

void main()

{

int i;

while(1)

{

scanf("%d",&n);

if(n==0)

break;

sum=0;

for(i=0;i<n;i++)

{

scanf("%d",&a[i]);

}

MergeSort(0,n-1);

printf("%I64d\n",sum);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: