Guest User

Untitled

a guest
Jun 20th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.20 KB | None | 0 0
  1. // to find the inversion count of array
  2. #include<stdio.h>
  3. #define INT_MAX 999999999
  4.  
  5. long long int count=0;
  6.  
  7. void inversion_count(long int A[],int low,int mid,int high)
  8. {
  9.     int i,j,k;
  10.     int n1=mid-low+1;
  11.     int n2=high-mid;
  12.     long int l[100001],r[100001];
  13.     for(i=1;i<=n1;++i)
  14.         l[i]=A[low+i-1];
  15.     for(j=1;j<=n2;++j)
  16.         r[j]=A[mid+j];
  17.     l[i]=r[j]=INT_MAX;
  18.     i=j=1;
  19.     for(k=low;k<=high;++k)
  20.     {
  21.         if(l[i]<=r[j])
  22.         {
  23.             A[k]=l[i];
  24.             ++i;
  25.         }
  26.         else
  27.         {
  28.             A[k]=r[j];
  29.             ++j;
  30.             count+=n1-i+1;
  31.         }
  32.     }
  33. }
  34.  
  35. void partition(long int a[],int lo,int hi)
  36. {
  37.     int mid;
  38.     if(lo<hi)
  39.     {
  40.         mid=(lo+hi)/2;
  41.         partition(a,lo,mid);
  42.         partition(a,mid+1,hi);
  43.         inversion_count(a,lo,mid,hi);
  44.     }
  45. }
  46.  
  47. int main()
  48. {
  49.     int t,n,i;
  50.     long int arr[200000];
  51.     scanf("%d",&t);
  52.     printf("\n");
  53.     while(t--)
  54.     {
  55.         count=0;
  56.         scanf("%d",&n);
  57.         for(i=0;i<n;++i)
  58.         {
  59.             scanf("%ld",&arr[i]);
  60.         }
  61.         printf("\n");
  62.         partition(arr,0,n-1);
  63.         printf("%lld",count);
  64.     }
  65.     return 0;
  66. }
Add Comment
Please, Sign In to add comment