package main import ( "fmt" "sort" ) func main() { var n int fmt.Scan(&n) arr := make([]int, n) for i := range arr { fmt.Scan(&arr[i]) } res:= mergeAndCal(arr,0,len(arr)-1) fmt.Println(res) } //[] func mergeAndCal(arr []int, l int, r int) int { if l == r { return 0 } mid := (r-l)>>1 + l lCnt := mergeAndCal(arr, l, mid) rCnt := mergeAndCal(arr, mid+1, r) help := make([]int, r-l+1) i := l j := mid + 1 idx := 0 res := 0 for i <= mid && j <= r { if arr[i] <= arr[j] { help[idx] = arr[i] res += (r - j + 1) * arr[i] i++ } else { help[idx] = arr[j] j++ } idx++ } for i <= mid { help[idx] = arr[i] idx++ i++ } for j <= r { help[idx] = arr[j] idx++ j++ } for i := range help { arr[i+l] = help[i] } return res + lCnt + rCnt } func divideArray(nums []int, k int) [][]int { sort.Ints(nums) n := len(nums) res := [][]int{} for i := 0; i < n; i += 3 { if nums[i]+k > nums[i+2] { return [][]int{} } else { temp := []int{nums[i], nums[i+1], nums[i+2]} res = append(res, temp) } } return res }
详细解答见bili,左程云P22算法讲解。使用help数组辅助排序。line35,arr[i]<arr[j],那么比i大的元素个数为从j索引到r索引的元素个数。[0,mid]中已经实现过排序,所以需要算[mid+1,r]中有多少个元素大于arr[i]