Untitled
unknown
plain_text
2 years ago
1.5 kB
32
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...