ring.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package main
  2. import (
  3. "container/heap"
  4. "fmt"
  5. )
  6. type pair struct {
  7. _1 int
  8. _2 int
  9. }
  10. type maxHeap []pair
  11. func (h maxHeap) Len() int { return len(h) }
  12. func (h maxHeap) Less(i, j int) bool { return h[j]._1 < h[i]._1 }
  13. func (h maxHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
  14. func (h *maxHeap) Push(x interface{}) {
  15. *h = append(*h, x.(pair))
  16. }
  17. func (h *maxHeap) Pop() interface{} {
  18. l := len(*h)
  19. x := (*h)[l-1]
  20. *h = (*h)[:l-1]
  21. return x
  22. }
  23. func main() {
  24. var n, m int
  25. fmt.Scan(&n, &m)
  26. nums := make([]int, n)
  27. l, r := make([]int, n), make([]int, n)
  28. var h maxHeap
  29. for i := 0; i < n; i++ {
  30. fmt.Scan(&nums[i])
  31. heap.Push(&h, pair{nums[i], i})
  32. l[i] = (i + n - 1) % n
  33. r[i] = (i + 1) % n
  34. }
  35. sum := 0
  36. for i := 0; i < m; i++ {
  37. p := heap.Pop(&h).(pair)
  38. for l[p._2] == -1 {
  39. p = heap.Pop(&h).(pair)
  40. }
  41. sum += p._1
  42. left, right := l[p._2], r[p._2]
  43. l[p._2], r[p._2] = l[left], r[right]
  44. l[left], l[right] = -1, -1 // Mark element as used
  45. np := pair{nums[left] + nums[right] - p._1, p._2}
  46. heap.Push(&h, np)
  47. }
  48. fmt.Println(sum)
  49. }