Description
个蛋糕,每个蛋糕有。选个蛋糕满足
因为蛋糕摆成一个环所以
Solution
我因为最近天天做dp,直接就往dp上想的,其实是思维僵化。
然后本来可以骗46分的,因为没有考虑到答案可能是负数+数据点捆绑直接宝菱。
dp就前缀和优化dp就可以做了,很好写。
当然前面肯定要想到这个的最小值,显然是按从小到大排后得到的,因此其实是
这样按排序,消除影响。
枚举最后一个选的点,发现第一个选的点是具有决策单调性的(只会打表)
整体二分+可删对顶堆
这东西挺恶心的,总之我调了好久,经常推翻重来
总结一下:
整体二分:维护两个指针,,复杂度是的因为层,每次结束时,。左递归开始时肯定是取中一个点,,左边递归结束时一定是也(左dfs树最靠右的叶子),此时再右递归转移到 。考虑这一层的转移,显然是次,每次,而又有有层。
当然上面的复杂度证明中,不一定是确切的等于(如 会有和 取 ,每层跟有关总体也是级别的),易证影响不大/kk。
对顶堆:因为你需要维护前大的和(),如果你只存一个大根堆,删除或者加入是维护不了的。
因此前大的数存入小根堆里,其它小的数存入大根堆,每次加入一个数判断如果大于,分界,把加入,把该数加入。否则直接加入
然后删除也维护两个可删堆。每次删除的时候判断删的数是在中则加入,反之……
每次取出堆顶前判断是如果已经在可删堆内,直接删了(这是可删堆的常规操作……)
!!! 这里我犯过一个错误
你维护的不是你里面实际所有值的和。而是里面没有在中(没被删)的和。
即才是真正的前大。里面还存在着一些已经死去的傀儡……
所以实际上不一定等于,我们需要单独维护一个(这个很简单)
实现细节:不知道我的实现方式会不会比别人复杂
强制,的堆顶是存在的(没被删),需要每次后,删点即可。
Add的就是上面对顶堆说的那堆。
Del比较复杂,如果删除的是在中的,用替代删除的那个,即把加入,删除的值加入。这样也保证了守恒。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人