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]

京公网安备 11010502036488号