CF1415E题解

题面

把这些数分成 \(k+1\) 组,每组做完以后清零。
那么首先易证每一组里面一定是严格不增的,所以我们先要考虑给整个数组从大到小排序。
然后怎么去考虑当前的数扔到哪个组中呢?我们用贪心的想法,每次插入都让这次插入得到的答案最大,那么因为插入这个数所得到的答案和我插什么数没有关系,所以我每次都取最大的那一组插入。那这样就做到了局部性的优化。
为什么这样做是对的呢?我们想,这个数肯定是要插进去的。如果我插入的那一组再也不碰了,那么我插在哪里都一样。否则我设当前有两个组 \(x\)\(y\) ,如果我选 \(x\) ,那么 \(x\) 的增加更大(或损失更小),我下次再去选 \(x\) 的时候比去选 \(y\) 多了一个 \(x-y\) 。而且如果我选 \(y\) ,那么我再次选 \(y\) 的收益比选两次 \(x\) 要小,所以我选 \(x\) 而不选 \(y\)
显然这个选取的过程就是一个优先队列,那么每次我取最大的那一段,插进去以后重新塞回去就可以了。时间复杂度 \(O(n\log n)\)

代码

posted @ 2021-10-06 19:37  Chiimo  阅读(10)  评论(0编辑  收藏  举报