POJ_2299_Ultra-QuickSort(归并排序,逆序数)

http://poj.org/problem?id=2299

 1 # include <stdio.h>
 2 # include <string.h>
 3 # include <algorithm>
 4 # include <iostream>
 5 using namespace std;
 6 const int MAXN= 500005;
 7 __int64 a[MAXN],b[MAXN];
 8 __int64 cnt;
 9 void merge_sort(__int64 *a,int x,int y,__int64 *b)
10 {
11     __int64 mid,i,j,k;
12 
13     if(y>x+1)
14     {
15         __int64 p,q;
16         mid=(x+y)/2;
17         p=x;q=mid;i=x;
18         merge_sort(a,x,mid,b);
19         merge_sort(a,mid,y,b);
20         while(p<mid && q<y)
21         {
22             if(a[p]<=a[q])
23             {
24                 b[i++]=a[p++];
25             }
26             else 
27             {
28                 b[i++]=a[q++];
29                 cnt+=mid-p;
30             }
31         }
32         if(p==mid && q!=y)
33             while(q!=y)
34                 b[i++]=a[q++];
35         else if(p!=mid && q==y)
36             while(p!=mid)
37                 b[i++]=a[p++];
38     /*    另一种写法。
39         while(p<mid || q <y)
40         {
41         if(q>=y || (p<mid && a[p]<=a[q]))
42             t[i++]=a[p++];
43         else 
44         {
45             t[i++]=a[q++];
46             cnt+=mid-p;
47         }
48     }*/
49         for(i=x;i<y;i++)
50             a[i]=b[i];
51     }
52 }
53 int main()
54 {
55     int n,i,j;
56     while(scanf("%d",&n)!=EOF)
57     {
58         if(n==0)
59             break;
60         for(i=0;i<n;i++)
61         {
62             scanf("%I64d",&a[i]);
63             b[i]=a[i];
64         }
65         cnt=0;
66         merge_sort(a,0,n,b);
67         printf("%I64d\n",cnt);
68     }
69     return 0;
70 }

 

posted on 2013-08-19 19:32  随风浪子的博客  阅读(107)  评论(0编辑  收藏  举报

导航