CF1837F

原题

翻译

首先看到最大值最小就想到二分答案

当我们二分了一个x,我们考虑到恰好等于k的宣发不太好选,不如直接取得越多越好,换言之枚举分界点,看前后缀在选的数之和x的情况下最多能选多少个,再合并

而选数的过程可以用堆来维护前缀没有被选到数的最小值

最终复杂度O(nlognlogA)

能通过本题,但两个log的复杂度不够优秀,我们考虑优化复杂度


首先二分是不太好去掉的,所以我们考虑能不能把堆给优化掉

我们考虑换一种方法来维护堆,我们不维护没选过的数,而考虑维护选过数的最大值

当一个新的数进来后,我们观察能否这个数把最大值替换掉

这时可以发现我们的操作变成了:

  1. 插入一个数

  2. 弹出一个最大值并删除

我们发现我们计算了logA轮答案中每轮加入的数的顺序都是不变的,因此我们不妨对每个ai预处理出他加入后会到哪个元素前面(即找到最大的aj(注意不是j)满足j<i且$a_j \leq a_i),然后用链表维护本题即可

但这样其实有一个问题,就是如果aj被删除了怎么办

我们发现如果aj都被删除了ai被加入后肯定也会不满足条件而接着删除,否则我们取aj一定是比ai更优的

因此如果找不到aj不妨直接不加入ai即可

最终复杂度O(nlogA)

posted @   FOX_konata  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示