package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
const (
Mod = 1000000007
)
func InversePairs( nums []int ) int {
// write code here
ans := 0
mergeSort(nums, 0, len(nums)-1, &ans)
return ans
}
func mergeSort(nums []int, left, right int, ans *int) {
if left < right {
mid := (right-left)/2 + left
mergeSort(nums, left, mid, ans)
mergeSort(nums, mid+1, right, ans)
merge(nums, left, mid, right, ans)
}
}
func merge(nums []int, left, mid, right int, ans *int) {
temp := make([]int, right-left+1)
i, j, idx := mid, right, len(temp)-1
for i >= left && j >= mid+1 {
if nums[i] > nums[j] { // 比 j 之前所有元素都大(j 是 mid+1->j 最大的))
*ans += j-mid
*ans %= Mod
temp[idx] = nums[i]
idx--
i--
} else {
temp[idx] = nums[j]
idx--
j--
}
}
for i >= left {
temp[idx] = nums[i]
idx--
i--
}
for j >= mid+1 {
temp[idx] = nums[j]
idx--
j--
}
copy(nums[left:right+1], temp)
}