JOISC 2017 D

神题,模拟赛考到,不会,遂题解诞生。

读完题目,发现等价于给出若干 [li,ri],ci,需要将 ci 分为 k,,cik 两部分加到 [li,ri] 亦或 [1,li)(ri,n],要求最小化最后每个位置的值的最大值。

可以考虑一个调整法的思路,我们先假定全部分给 [li,ri],得到当前的解 pi,同时将 ci 拆分为 cili,ri 相同且 ci=1 的询问。

问题就变成给出一个集合,元素为区间,而我们现在需要从中找到一个最优秀的子集 S,使得将 [li,ri]S 拆为 [1,li1],[ri+1,n] 后最大值最小。

我们称这个拆解的过程为“反转”。

我们设这个拆分后每个位置上的值是 qi,那么会发现一些性质。

性质零

设最优答案为 ans,则我们声称 [ans,c] 都是存在方案的。

证明是显然的, i 的一个没有覆盖最大值的区间覆盖过去就好了。

性质一

可以发现,若 I1,I2S,且 I1I2=,则 S 并非最优。

证明:考虑此时我们不反转 I1,I2,则会让 q 产生如下变化:

  1. iI1I2,qiqi
  2. iI1I2,qiqi2

这样的变化一定不劣。

由此可以得到:一定存在最优集合 S,满足 S 里所有区间的交集不为空

形式化地,有:max[li,ri]Slimin[li,ri]Sri

下面我们称 I=[max[li,ri]S,li,min[li,ri]S,ri]


现在我们来考虑在多项式复杂度内解决本问题。

zi=[li,ri]]S[i[li,ri]],也就是包含它的元素个数。

那么有 qi=pi+(|S|zi)zi=pi2zi+|S|

设某个 tI,则 zt=|S|

考虑二分答案,设当前二分答案为 limit,如果合法的充要条件是什么呢?

也就是 S,t,maxqilimit

注意到我们在计算过程中只关心 |S|,也就是 zt,不妨枚举 t,zt,那么会有:max(pi2zi+zt)limitzipi+ztlimit2

考虑构造这样一个 S,可以想到一个显然正确的贪心算法:依次扫描 i:1t,并开一个优先队列,维护当前待使用的所有区间,按照 r 排序,当前发现 zi 不足,那么就贪心地选大的 r 填上去。

最后再判断 t+1nz 是否符合即可。

复杂度 O(n2mlogmlogV)


注意到复杂度主要开销是 (t,zt) 的枚举。

性质二

我们断言,如果最优解不是 S=,那么一定有 t,S,maxiIqimaxiqi1,maxiqilimit

考虑如下当 maxiIqi<maxiqi1 时对 S 的调整:

以下操作只要 S 不为空且条件不满足持续进行。

  1. IS,直接删除 I,那么有 iI,qiqi+1,iI,qiqi1,导致两者差距缩小 2
  2. 否则考虑取到 I 的两个集合,也就是 rmin,lmax 所在的两个区间 A,B,将其删去,那么有 iI,qiqi+2,其余 qi 不变,也可以将差距缩小 2

可以发现操作始终可以进行,因此最终必然可以操作到满足条件,或者 S=

注意到我们可以钦定 t 为取到 maxiIqii,因为 I 中的点对于 S 这个方案而言是等价的

由此,我们可以知道 maxiIqi=qtmaxiqi1,而由性质零和构造方法,只要有解,那么我们就可以强化为构造出一个正好答案是 maxiqi=limit 的解,因此 limitqt=ptztlimit1,因此对于 t,我们仅需枚举 plimit(+1) 这两个即可。

复杂度降到 O(n2logmlogV)

性质三

我们断言,如果最优解 S,那么一定是有某个最优的 S,t,满足 pt=maxpi

注意到这个 t 同样取到了 maxiIqi,因此有:

qt=ptztmaxiqi1maxi(pi2zi+zt)1max(pizt+[iI])1

这推出 ptmax(pi+[iI])1pt=maxpi

性质四

更强于性质三的,我们给出,如果最优解不是 S=,那么存在最优解 S,任意 {t|pt=maxipi}I

设一个 x,px=maxpi,则 qx=px+|S|2zxanspx|S|+12|S|2zx1

由于左边是偶数且非负,所以只能取到 zx=|S|,因此 xI

综合各个性质,我们仅需 2 次贪心算法就可以 check 了。

O(nlogmlogV) 解决问题。

posted @   spdarkle  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示