Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- T.C O(nlogn) S.C O(n)
- logic:
- *We want pair of elements where first element should be greater and second should be smaller.
- *We applied merge sort but while merging two sorted arrays,if left array ie. arr1 ith
- element which is greater than jth element of right array ie. arr2 then all the elements
- after ith element including ith element will be greater than jth element of arr2 because
- both array is sorted so that satisfies our condition so we will add that in answer.
- */
- long long int res=0;
- class Solution{
- public:
- void merge(int l,int mid,int r,vector <long long int> &arr){
- vector <long long int> arr1,arr2;
- for(long long int i=l;i<=mid;i++)
- arr1.push_back(arr[i]);
- for(long long int i=mid+1;i<=r;i++)
- arr2.push_back(arr[i]);
- long long int i=0,j=0;
- long long int n1=arr1.size();
- long long int n2=arr2.size();
- long long int k=l;
- while(i<n1 && j<n2){
- if(arr1[i]>arr2[j]){
- res=res+(n1-i); //all elements of left array after ith element and including
- arr[k++]=arr2[j++]; //ith element will be greater than jth element
- }
- else{
- arr[k++]=arr1[i++];
- }
- }
- if(i<n1){
- while(i<n1){
- arr[k++]=arr1[i++];
- }
- }
- if(j<n2){
- while(j<n2)
- arr[k++]=arr2[j++];
- }
- }
- void count_inversions(long long int l,long long int r,vector <long long int> &arr){
- if(l<r){
- long long int mid=(l+r)/2;
- count_inversions(l,mid,arr);
- count_inversions(mid+1,r,arr);
- merge(l,mid,r,arr); //l to mid is sorted and mid+1 to r is sorted.
- }
- }
- long long int inversionCount(long long ar[], long long N)
- {
- res=0;
- vector <long long int> arr;
- for(long long int i=0;i<N;i++)
- arr.push_back(ar[i]);
- count_inversions(0,N-1,arr);
- return res;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement