技巧:
归并排序
思路
归并排序统计数量
实现
package main
import (
. "fmt"
"os"
"io"
"bufio"
)
var cnt int
var tmp []int
func mergeSort(arr []int, l, r int) {
if l < r {
m := l + (r -l)/2
mergeSort(arr,l,m)
mergeSort(arr,m+1,r)
ll,rr :=l,m+1
for i := l; i <= r;i++{
if ll <= m && (rr > r|| arr[ll] <= arr[rr]){
tmp[i] = arr[ll]
ll++
}else {
tmp[i] = arr[rr]
cnt += m - ll + 1
rr++
}
}
for i := l; i<=r;i++{
arr[i] = tmp[i]
}
}
}
// https://ac.nowcoder.com/acm/problem/15163
func NC15163(_r io.Reader, _w io.Writer) {
in, out := bufio.NewReader(_r), bufio.NewWriter(_w)
defer out.Flush()
var n int
Fscan(in, &n)
arr := make([]int, n)
tmp = make([]int, n)
for i := 0; i < n; i++ {
Fscan(in, &arr[i])
}
mergeSort(arr, 0, n-1)
Fprintln(out, cnt)
}
func main() {
NC15163(os.Stdin, os.Stdout)
}

京公网安备 11010502036488号