Untitled

 avatar
unknown
plain_text
2 years ago
1.5 kB
27
Indexable
public class Solution {
    public int solve(int[] A) {
        return ip(A, 0, A.length - 1);
    }
    
    public int ip(int[] arr, int l, int r){
        if(l == r){
            return 0;
        }
        int mid = (l + r) / 2;
        int f1 = ip(arr, l, mid);
        int f2 = ip(arr, mid + 1, r);
        int f3 = merge(arr, l, mid + 1, r);
        return f1 + f2 + f3;
    }
    
    public int merge(int[] arr, int l, int y, int r){
        //subarray from l to y - 1 is sorted and subarray from y to r is sorted
        int[] res = new int[r - l + 1];
        int i = l, j = y, k = 0;
        int rp = 0;
        
        while(i < y && j <= r){
            if((long)arr[i] <= (long)(2l * arr[j])){
                i++;
            }else{
                j++;
                rp = rp + (y - i);
            }
        }
        
        i = l;
        j = y;
        
        while(i < y && j <= r){
            if(arr[i] <= arr[j]){
                res[k] = arr[i];
                i++;
                k++;
            }else{
                res[k] = arr[j];
                j++;
                k++;
            }
        }
        
        while(i < y){
            res[k] = arr[i];
            i++;
            k++;
        }
        
        while(j <= r){
            res[k] = arr[j];
            j++;
            k++;
        }
        
        k = 0;
        for(i = l ; i <= r; i++){
            arr[i] = res[k];
            k++;
        }
        
        return rp;
    }
}
Editor is loading...