|
@@ -0,0 +1,56 @@
|
|
|
|
+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)
|
|
|
|
+}
|