Untitled
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...