import java.util.*;
public class Solution {
// 思路:归并排序的思想,分治之后排序合并
public int mod = 1000000007;
public int mergeSort(int left, int right, int[] nums, int[] temp) {
if (left >= right) {
return 0;
}
int mid = (left + right) / 2;
// 递归分治,左右划分合并
int res = mergeSort(left, mid, nums, temp) + mergeSort(mid + 1, right, nums,
temp);
// 防止溢出
res %= mod;
// 排序逻辑处理
int i = left, j = mid + 1;
for (int k = left; k <= right; k++) {
temp[k] = nums[k];
}
for (int k = left; k <= right; k++) {
if (i == mid + 1) {
nums[k] = temp[j++];
} else if (j == right + 1 || temp[i] <= temp[j]) {
nums[k] = temp[i++];
// 左边比右边大,答案增加
} else {
nums[k] = temp[j++];
// 当左子数组的元素 temp[i] 大于右子数组的元素 temp[j] 时,temp[i] 及其后面的所有元素(从 i 到 mid)都与 temp[j] 构成逆序对,因此逆序对数量增加 mid - i + 1。
res += mid - i + 1;
}
}
return res % mod;
}
public int InversePairs (int[] nums) {
// write code here
int n = nums.length;
int[] res = new int[n];
return mergeSort(0, n - 1, nums, res);
}
}