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 }

 

你可能感兴趣的:(OJ)