1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- package main
- import (
- "container/heap"
- "fmt"
- )
- type pair struct {
- _1 int
- _2 int
- }
- type maxHeap []pair
- func (h maxHeap) Len() int { return len(h) }
- func (h maxHeap) Less(i, j int) bool { return h[j]._1 < h[i]._1 }
- func (h maxHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
- func (h *maxHeap) Push(x interface{}) {
- *h = append(*h, x.(pair))
- }
- func (h *maxHeap) Pop() interface{} {
- l := len(*h)
- x := (*h)[l-1]
- *h = (*h)[:l-1]
- return x
- }
- func main() {
- var n, m int
- fmt.Scan(&n, &m)
- nums := make([]int, n)
- l, r := make([]int, n), make([]int, n)
- var h maxHeap
- for i := 0; i < n; i++ {
- fmt.Scan(&nums[i])
- heap.Push(&h, pair{nums[i], i})
- l[i] = (i + n - 1) % n
- r[i] = (i + 1) % n
- }
- sum := 0
- for i := 0; i < m; i++ {
- p := heap.Pop(&h).(pair)
- for l[p._2] == -1 {
- p = heap.Pop(&h).(pair)
- }
- sum += p._1
- left, right := l[p._2], r[p._2]
- l[p._2], r[p._2] = l[left], r[right]
- l[left], l[right] = -1, -1 // Mark element as used
- np := pair{nums[left] + nums[right] - p._1, p._2}
- heap.Push(&h, np)
- }
- fmt.Println(sum)
- }
|