先将题目给出的转化为单调不降序列。具体来说,对题目给出的原序列,每个位置都减去其下标得到;对任意一种构造的,也都减去其下标得到,显然;下文都以指代,并设表示中的 ~ 排好序之后的数组(也就是说是一个三维数组)
问题一:如果知道了对于,最好的构造的都是相同的(即),那么的值应该为什么?
答:显然为货仓选址问题,取的中位数(如果为偶数,任取一个数都可以)
问题二:如果知道了对于,存在一个下标,使得 ~ 的最佳构造的相同(i.e.当时,最小)且 ~ 的最佳构造的相同(i.e.当 时,最小),是否可以构造出整个的最佳构造,如果可以,如何构造?
答:可以构造出来。不妨设
如果说,那么整个的最佳构造就是,这是因为,两者刚好取到下界且满足单调不降
如果说,考虑一个最优构造,如果说,我们将的前个数全部变成,显然满足单调不降而且答案不会更差;否则的话,此时已经有,如果此时还有,我们将全部改成,显然满足单调不降且答案不会更差。也就是说一定存在一组最优解,使得。接下来考虑的前个数。假设现在长成这个样子:

我们将除了最后一段的剩下的整体向上移动到倒数第二段与最后一段相同,如下

此过程答案一定不会更差。这是因为:设(移动前)最后一段的下标为 ~ ,那么对于前个数来说,(也就是的前个数的中位数,想一下为什么的下标一定是而不能是其他的)一定不会低于(否则的话的前个数的取值不会是,而是,这样答案肯定严格更优秀,就与我们的假设矛盾了),也就是说的前个数至少有个数不低于,而上面的移动让的前个数更加接近,于是增加的值一定不会超过减少的值。推而广之,最后我们可以将的前个数变成相同的值,为。此时我们不再考虑后面的,只考虑的前个数(也就是暂时先不管整个的单调不降),将这个数往整体移动,显然答案也不会变差
对于后面的,我们也可以类似地证明,可以将所有的都变成并且可以再整体往靠近;这样的话,我们就可以最终将整体变成一样的值(注意最开始有),并且答案不会更差
也就是说,对于整个来说,存在一个最优解使得所有的值相同;由于当全部取的中位数的时候,是在满足“的值都相同”的前提下,答案最小的解,所以这就是在满足“的值都相同”的前提下的下界,而我们肯定可以达到这个下界,于是构造完毕
有了上面两个问题做铺垫,我们来考虑原问题。注意原问题是满足子问题最优性的。
假设现在已经构造好了前个数的最优解,对于,如果,那么,从而找到了前个数的最优解;否则的话,我们令,其中是的中位数,这样的话就找到了在前个不变的情况下的最优解(因为此时根据子问题最优性,是最小的,而根据上面的问题的回答,也是最小的,两段同时取到了下界,于是为最优解)。然后考虑,如果,那么就停止循环,否则的话,令(其中为的中位数)。一直重复上述操作直到一个下标(不能再继续操作了,因为已经构造了的后面一段的中位数不低于前面一段了),现在的前个数是我们之前已经构造好了的数,同时也是使得最小的构造(原问题满足子问题最优性),后面的的值都相同,为后面的的中位数,显然此时也有最小,于是原问题就取到了下界
但是上述过程一个一个地考虑太慢了,考虑优化。实际上,当我们循环到的时候,都是一段一段的,如下

当我们加入的时候直接与最后一段进行比较,如果,那么根据上面的第二个问题,可以直接找出 ~ 的最优解,此时如果 ~ 的中位数不低于前一段(即 ~ 这一段),那么直接插入,否则根据问题二可以继续合并;直到某一时刻可以直接插入了就停止循环。此时一定是最优解,因为在插入位置的前面,有取到最小值,在插入位置的后面,有取到最小值,于是得到最优解
所以现在要解决的问题就是,如何快速得出两个数列合并之后的中位数。我们尝试用大根堆左偏树维护数列的前一半的数(如果数列有偶数个,那么堆顶为,否则的话为)。一个自然的想法就是在合并两个线段的时候,直接合并两个左偏树,得到的新的左偏树的堆顶就是新数列的中位数。但实际上这个样子是错误的,一个反例就是一个数列的数都非常小,另一个数列的数都非常大,于是新数列的中位数来源于比较小的数的数列,但是这个值却没有在其左偏树中维护,于是我们得不到新的中位数的信息。这就说明了左偏树不能直接维护没有任何限制的合并线段的中位数。然而,这道题目却可以这么做。因为:每次我们加入一个数,假设小于最后一段的值,那么就说明小于最后一段的中位数,于是最后一段加上的中位数一定会在和最后一段前一半小的数中产生,就不会有上面的问题。归纳一下,假设我们已经正确合并了后面若干段和得到了正确的中位数。对于接下来的一段,设这一段的下标为,那么就是说我们已经得到了的中位数。由于的中位数不低于的中位数(这个尝试证明一下),加入了后,最多让的中位数往前移动一位,分类讨论之后可以发现也不会存在上面所说的问题,可以直接用左偏树合并
时间复杂度是多少?每个线段会入队一次和出队一次。入队复杂度为,出队复杂度为
具体见打卡代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2023-08-18 阶乘分解