Advertisement
imashutosh51

Count inversions

Aug 10th, 2022 (edited)
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.90 KB | None | 0 0
  1. /*
  2. T.C O(nlogn) S.C O(n)
  3. logic:
  4. *We want pair of elements where first element should be greater and second should be smaller.
  5. *We applied merge sort but while merging two sorted arrays,if left array ie. arr1 ith
  6.  element which is greater than jth element of right array ie. arr2 then all the elements
  7.  after ith element including ith element will be greater than jth element of arr2 because
  8.  both array is sorted so that satisfies our condition so we will add that in answer.
  9. */
  10.  
  11. long long int res=0;
  12. class Solution{
  13.   public:
  14.     void merge(int l,int mid,int r,vector <long long int> &arr){
  15.     vector <long long int> arr1,arr2;
  16.     for(long long int i=l;i<=mid;i++)
  17.         arr1.push_back(arr[i]);
  18.     for(long long int i=mid+1;i<=r;i++)
  19.         arr2.push_back(arr[i]);
  20.        
  21.     long long int i=0,j=0;
  22.     long long int n1=arr1.size();
  23.     long long int n2=arr2.size();
  24.     long long int k=l;
  25.  
  26.     while(i<n1 && j<n2){
  27.           if(arr1[i]>arr2[j]){
  28.               res=res+(n1-i);  //all elements of left array after ith element and including
  29.               arr[k++]=arr2[j++];  //ith element will be greater than jth element
  30.           }
  31.           else{
  32.               arr[k++]=arr1[i++];
  33.           }
  34.     }
  35.     if(i<n1){
  36.         while(i<n1){
  37.             arr[k++]=arr1[i++];
  38.         }
  39.     }
  40.     if(j<n2){
  41.         while(j<n2)
  42.            arr[k++]=arr2[j++];
  43.     }
  44. }
  45. void count_inversions(long long int l,long long int r,vector <long long int> &arr){
  46.     if(l<r){
  47.         long long int mid=(l+r)/2;
  48.         count_inversions(l,mid,arr);
  49.         count_inversions(mid+1,r,arr);
  50.         merge(l,mid,r,arr);  //l to mid is sorted and mid+1 to r is sorted.
  51.     }
  52. }
  53. long long int inversionCount(long long ar[], long long N)
  54.     {
  55.     res=0;
  56.     vector <long long int> arr;
  57.     for(long long int i=0;i<N;i++)
  58.        arr.push_back(ar[i]);
  59.    
  60.     count_inversions(0,N-1,arr);
  61.     return res;
  62. }
  63. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement