1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| package main
func InversePairs(data []int) int { tmp := make([]int, len(data)) count := 0 mergeSort(data, tmp, 0, len(data)-1, &count) return count }
func mergeSort(data, tmp []int, start, end int, count *int) { if start >= end { return }
mid := start + (end-start)>>1
mergeSort(data, tmp, start, mid, count) mergeSort(data, tmp, mid+1, end, count) merge(data, tmp, start, mid, end, count)
return
}
func merge(data, tmp []int, start, mid, end int, count *int) { if start >= end { return }
i := start j := mid + 1 k := start for i <= mid && j <= end { if data[i] <= data[j] { tmp[k] = data[i] i++ } else { *count = *count + (mid - i + 1) *count = *count % 1000000007 tmp[k] = data[j] j++ } k++ }
for i <= mid { tmp[k] = data[i] i++ k++ }
for j <= end { tmp[k] = data[j] j++ k++ }
for i = start; i <= end; i++ { data[i] = tmp[i] }
return }
|