省选备战报告 第零辑 分块与根号平衡
本笔记仅仅记录重点思路,详细解题过程请参阅原题题解
难度从低到高为
- NÄIVE:有效思考时间少于十分钟
- EASY:能够完全独立得出
- MEDIUM EASY:需要题解提供关键思路跨越
- MEDIUM:需要查看题解的较多思路
- HARD:必须查看题解、并用长时间理解
- HELL:花费极长时间理解,非常难以复现
带有加号表示实现细节较多、需要格外注意。
完全不会做的题目不包括在难度列表中
正文
T0 [SD&SXOI2022] Day1T1 整数序列
Tag
根号分治、复杂度分析、暴力
带
严格根号做法:MEDIUM+(思维中等;细节多;代码长)
解题要点
为何想到根号分治
每次提问中相互影响的仅有两种数据,且若规模相差悬殊,时间只取决于较小的那一个。
根号分治的特点在于,按照数量将原始数据分类。其中小块受到大小限制,大块受到个数限制。思维的关键点在于小对大的处理。
处理时利用小块数量少的特点,将此特点转化为搜索空间小的优势。
时间复杂度分析
由于大对小时间复杂度取决于小块的长度,那就尽量把最长的小块多问几次。所以当假设有
接下来更进一步,每处理一个询问所需要的时间是【扫描所有 set
中查找】,总复杂度为:
表示小块长度, 表示大块长度
放缩,上式一定小于
化简后可得
也就是
不严格根号做法
小对小直接暴力,大对大也直接暴力,考虑到大块数量少,后者可以记忆化,这两部分耗时
因此总复杂度为
严格根号做法
上一种做法中,为了筛出所有的有效点,需要采用 set
维护有效点的区间,考虑如何移除掉set
代码
T1 [ZJOI2022] Day2T2 众数
Tag
根号平衡、复杂度分析
难度:MEDIUM(思维中等;细节少;代码中等)
解题要点
为何判定为根号分治
一般有有关于“众数”、“出现次数”的题目都应想到根号分治,因为这种题目需要处理颜色个数类的信息。
如何转化问题
“加上任意数”这种条件可以直接忽略,因为这种操作可以把任意数转化为任意数。问题的本质是把区间分成两段,并在内外各选出一个数,使得这两个数的出现次数总和是所有情况中最大的。
进一步,我们发现对答案产生贡献的仅有这两个数,并且它们也一定分别是内区间与外区间的众数(若不是的话,取众数更优)。这样问题表现出了显著的根号平衡特征。
经验:根号分治适用于“两两相对”/“需要考虑出现次数”类的问题
“小对大”时间复杂度分析
在处理大对小的情况时,我们需要枚举大块
纯净区间,即把颜色为
的所有点单独拉出来组成的区间。
其时间复杂度并非
而应是
这是因为小块的个数不能按照
小对小处理
大对小的情况下处理外层枚举大块前缀和即可,小对小的情况下,考虑到小块最多的元素个数也只有
内循环需要枚举所有的众数出现次数为
T2 [CF1039D] You are given a tree
Tag
贪心及其证明、根号平衡、二分
难度:MEDIUM EASY(思维中等;细节少;代码短)
解题要点
为什么贪心是对的
本题的
而这个问题可以
对于每一个点,判断它儿子中【空余链长最长、次长的两个】能否放下一条长度为
为什么是对的呢?考虑决策包容性。假设存在一个点
同时,如果只看
为何考虑到根号平衡
考虑数值不同的答案的分布情况,发现后半部分出现大量答案重叠,猜测以根号为分界线。
后半部分的做法
这一部分有点类似于数论分块。
我们发现最后的 check
函数可以利用刚刚的贪心实现。
为什么是二分?因为答案随链长的增加单调不增,具体来说,如果能放下
条长度为 的链,那么没有理由放不下同样 条长度更短的。
把两个部分合起来,时间复杂度为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?