funcminimumCost(nums[]int,kint,distint)int64{res:=nums[0]+slices.Min(windowTopKSum(nums[1:],dist+1,k-1,true))returnint64(res)}funcwindowTopKSum(nums[]int,windowSize,kint,minbool)[]int{n:=len(nums)ts:=NewTopKSum(k,min)res:=[]int{}forright:=0;right<n;right++{ts.Add(nums[right])ifright>=windowSize{ts.Discard(nums[right-windowSize])}ifright>=windowSize-1{res=append(res,ts.Query())}}returnres}typeTopKSumstruct{sumintkintin*Heapout*HeapdIn*HeapdOut*Heapcountermap[int]int}funcNewTopKSum(kint,minbool)*TopKSum{varlessfunc(a,bint)boolifmin{less=func(a,bint)bool{returna<b}}else{less=func(a,bint)bool{returna>b}}return&TopKSum{k:k,in:NewHeap(less),out:NewHeap(less),dIn:NewHeap(less),dOut:NewHeap(less),counter:map[int]int{},}}func(t*TopKSum)Query()int{returnt.sum}func(t*TopKSum)Add(xint){t.counter[x]++t.in.Push(-x)t.sum+=xt.modify()}func(t*TopKSum)Discard(xint)bool{ift.counter[x]==0{returnfalse}t.counter[x]--ift.in.Len()>0&&-t.in.Top()==x{t.sum-=xt.in.Pop()}elseift.in.Len()>0&&-t.in.Top()>x{t.sum-=xt.dIn.Push(-x)}else{t.dOut.Push(x)}t.modify()returntrue}func(t*TopKSum)SetK(kint){t.k=kt.modify()}func(t*TopKSum)GetK()int{returnt.k}func(t*TopKSum)Len()int{returnt.in.Len()+t.out.Len()-t.dIn.Len()-t.dOut.Len()}func(t*TopKSum)Has(xint)bool{returnt.counter[x]>0}func(t*TopKSum)modify(){fort.out.Len()>0&&(t.in.Len()-t.dIn.Len()<t.k){p:=t.out.Pop()ift.dOut.Len()>0&&p==t.dOut.Top(){t.dOut.Pop()}else{t.sum+=pt.in.Push(-p)}}fort.in.Len()-t.dIn.Len()>t.k{p:=-t.in.Pop()ift.dIn.Len()>0&&p==-t.dIn.Top(){t.dIn.Pop()}else{t.sum-=pt.out.Push(p)}}fort.dIn.Len()>0&&t.in.Top()==t.dIn.Top(){t.in.Pop()t.dIn.Pop()}}typeH=intfuncNewHeap(lessfunc(a,bH)bool,nums...H)*Heap{nums=append(nums[:0:0],nums...)heap:=&Heap{less:less,data:nums}heap.heapify()returnheap}typeHeapstruct{data[]Hlessfunc(a,bH)bool}func(h*Heap)Push(valueH){h.data=append(h.data,value)h.pushUp(h.Len()-1)}func(h*Heap)Pop()(valueH){ifh.Len()==0{panic("heap is empty")}value=h.data[0]h.data[0]=h.data[h.Len()-1]h.data=h.data[:h.Len()-1]h.pushDown(0)return}func(h*Heap)Top()(valueH){value=h.data[0]return}func(h*Heap)Len()int{returnlen(h.data)}func(h*Heap)heapify(){n:=h.Len()fori:=(n>>1)-1;i>-1;i--{h.pushDown(i)}}func(h*Heap)pushUp(rootint){forparent:=(root-1)>>1;parent>=0&&h.less(h.data[root],h.data[parent]);parent=(root-1)>>1{h.data[root],h.data[parent]=h.data[parent],h.data[root]root=parent}}func(h*Heap)pushDown(rootint){n:=h.Len()forleft:=(root<<1+1);left<n;left=(root<<1+1){right:=left+1minIndex:=rootifh.less(h.data[left],h.data[minIndex]){minIndex=left}ifright<n&&h.less(h.data[right],h.data[minIndex]){minIndex=right}ifminIndex==root{return}h.data[root],h.data[minIndex]=h.data[minIndex],h.data[root]root=minIndex}}