『省选模拟赛1』 Day5 总结
前言
落日沉溺于橘色的海,晚风沦陷于赤诚的爱。
省流:省选集训,
T1 不会用
T2 分界点,我以为这个结论是错的,可能有些是第一种转移,有些是第二种转移,然后就否掉了。
T3 文件名打错了,
真,糖丸了。
T1
不会使用
首先显然有一个
转移分为两种:
实现常数足够小的话,应该可以除以一个
考虑如何优化。
其实首先有一种,即从小到大枚举边权,每加入一条边看这条边可以扩展到多少
不过我们考虑另一种,即二分答案,然后将
考虑使用
总时间复杂度
T2
告诉我们想到了什么奇葩结论就要敢于认为它是对的并去验证。
仍然先考虑暴力 DP。
首先,对于一堆
所以我们先按照
然后考虑定义
转移很简单:
时间复杂度
考虑如何对这个转移式子进行优化。
通过打表发现,对于每个
简单来说,就是每一个
故可以考虑使用平衡树优化 DP 来优化这个过程。
具体的,对于每个
由于我太菜了,不会打平衡树,所以补题的时候用的块状链表来替代。
平衡树复杂度
听说有平衡树上二分的单
T3
题解里面一堆这个题的相关结论,到时候再来看看。
稍微简单记一下吧,真要写起来还是太多了。
首先你最开始看上去只会
我们需要一个有前景的多项式做法。
考虑对于方案进行观察来找出一些限制。以下皆称翻转区间的方案集合为
首先有一个为了方便叙述的东西要写在前面。
假设最终答案为
,那么对于 ,这样的 是一定存在对应的方案的。(当然前提是你最大能凑的出来。)
证明感性理解,从
对于任意一个答案最优的翻转集合
,必然不存在 ,且这两个区间不相交。
考虑反证,如果有一个集合
可以发现,如果我们不翻转这两个区间,会对答案造成一下变化:
,显然 的被覆盖的次数在翻转之后是不会变的。 ,显然 的被覆盖次数会减少 。
可以发现这样的调整是不劣的,故上述性质是成立的。
其实我们已经可以通过上面的结论推出第一个多项式复杂度的算法。
先给出一些定义:
表示点 在翻转了 内的区间之后,被覆盖的次数。 表示在 被翻转之前, 被覆盖的次数。(这东西在区间输入完之后是一个定值。) 表示 号点在 内部的区间中,翻转前被覆盖的次数,形式化的: 表示 内所有区间的点的交集。(已经证明过必然存在交集。)
对于每个
可以发现,对于每一种方案
对于
为了去得到跟答案相关的
我们发现,此时
不可能暴力去搜索,所以我们考虑二分答案
我们要做的就是通过控制
观察到
于是有一个比较直观的贪心,考虑从
最后看
此时时间复杂度
可以发现,一个很需要优化的空间在于,我们浪费了很多时间去枚举
对于最优的
,其一定满足 。用人话说就是在 中的点他们的被覆盖次数的最大值和最终的 最多只会差 。
我们仍然还是去考虑不符合条件的
- 如果存在一个区间
且其对应的点集 ,那么直接删掉 ,可以发现对于 ,差距在减小。 - 否则假设
中的点对应的是区间 ,考虑在 中找到 这两个区间(可以发现这两个区间至少会分别在 中存在一个),把他们删掉,此时, ,剩下的 再怎么也是在减小,所以差距仍然在减小。
可以发现终止条件要么是
回顾一下第一个算法,我们是去枚举的
我们定义的
由于
此时时间复杂度
那我们可不可以试图去优化
对于最优的
,如果 ,其中一定存在一个,满足 。也就是说,输入之后被覆盖的最多的点的其中一个,一定会存在于某个最优的 所对应的 中。
其实,这个
我们从
首先有
由于
此时,
对于最优的
,如果 ,那么一定存在一个 ,满足所有的 。
我们有了正向的从
对于任意的
故根据后面的不等关系,
于是证毕。
由于已经证明了
时间复杂度来到
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探