package main import . "fmt" func main() { var n int Scan(&n) vs := make([]int, n) for i := range vs { var p int Scan(&p) vs[p-1] = i } ans := 0 for i := 0; i < n; i++ { for j := i+1; j < n; j++ { if vs[i] > vs[j] { vs[i],vs[j] = vs[j],vs[i] ans++ } } } Println(ans) } /* 考察 順列pを v[p[i]] = i と配列vに置換すると 例えばp[i]-p[j]<=1でのp[i],p[j]の交換ならばp[i]=p[j]+1で即ちv[p[j]]とv[p[j]+1]との交換、配列vの隣同士の要素の交換 つまり順列pを昇順並び替えするのは配列vを昇順バブルソートするに相当する感じ? nが3000と小さいので愚直にバブルソートやって数えればいいと思うけど やり方を忘れたけど効率のよい数え方とかあった気がした(転倒数だっけ?) */