usotsuki

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

poj2299

这道题的目的为求逆序数,冒泡排序交换相邻元素的次数也就是初始序列的逆序数。

 

 1 #define MAX 500001
 2 
 3 int n,a[MAX],t[MAX];
 4 
 5 long long sum;
 6 
 7 void merge(int l,int m,int r)
 8 {
 9     int p=0;
10     int i=l,j=m+1;
11     while(i<=m&&j<=r)
12     {
13         if(a[i]>a[j])
14             t[p++]=a[j++],sum+=m-i+1;
15         else
16             t[p++]=a[i++];
17     }
18     while(i<=m)t[p++]=a[i++];
19     while(j<=r)t[p++]=a[j++];
20     for(i=0;i<p;i++)
21         a[l+i]=t[i];
22 }
23 
24 
25 void mergesort(int l,int r)
26 {
27     int m;
28     if(l<r)
29         m=(l+r)/2,
30         mergesort(l,m),
31         mergesort(m+1,r),
32         merge(l,m,r);
33 }
34 main()
35 {
36     int i;
37     while(~scanf("%d",&n)&&n)
38     {
39         sum=0;
40         for(i=0;i<n;i++)
41             scanf("%d",&a[i]);
42         mergesort(0,n-1);
43         printf("%lld\n",sum);
44     }
45 }

 

posted on 2013-09-17 13:46  usotsuki  阅读(125)  评论(0)    收藏  举报