NYOJ117 求逆序数

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 int a[1000004],tmp1[500002],tmp2[500002];
 5 long long cnt;
 6 void merge(int start,int mid,int end){
 7     int i,j,k;
 8     for(k=0,i=start; i<=mid; i++)
 9         tmp1[k++]=a[i];
10     tmp1[k]=0x7fffffff;
11     for(k=0,i=mid+1; i<=end; i++)
12         tmp2[k++]=a[i];
13     tmp2[k]=0x7fffffff;
14     for(i=j=0,k=start; k<=end; k++){
15         if(tmp1[i]<=tmp2[j]){
16             a[k]=tmp1[i++];
17         }else{
18             a[k]=tmp2[j++];
19             cnt+=mid-start+1-i; 
20         }
21     }
22 }
23 
24 void mergeSort(int start,int end){
25     if(start<end){
26         int mid=(start+end)/2;
27         mergeSort(start,mid);
28         mergeSort(mid+1,end);
29         merge(start,mid,end);
30     }
31 }
32 
33 int main()
34 {
35     int i,T,n;
36     scanf("%d",&T);
37     while(T--){
38         scanf("%d",&n);
39         for(cnt=0,i=0;i<n;i++)
40             scanf("%d",&a[i]);
41         mergeSort(0,n-1);
42         printf("%lld\n",cnt);
43     }
44     return 0;
45 }

 

posted on 2013-01-02 23:35  小花熊  阅读(260)  评论(0编辑  收藏  举报

导航