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 }