残阳褪去纯白的地平线,烟火绽放燃尽的灼之花
欧拉回路
感觉自己学了个假的欧拉回路。
trick 1#
- 给定一个图,我们需要给每个边定向,使得每个点入度与出度差不超过 。
首先,因为有奇数点的存在,我们不能直接构造出欧拉回路。所以我们建立一个虚点,然后从所有奇数点和虚点连边,显然此时所有点度数都为偶数,我们跑欧拉回路求一组解,容易验证符合要求。
- 应用
CF723E One-Way Reform#
注意到答案的上界是偶数点数量,而上述构造显然可以符合要求。
CF547D Mike and Fish#
考虑建立行-列的二分图,每个点就变成了一条边,我们跑一遍上述定向过程,然后把从左到右的边定位蓝色,反之为红色,显然符合要求。
CF429E Points and Segments#
考虑差分一下,那么就变成了 单点加减。
对于每个位置,求出其被多少个区间覆盖了。
假设所有点都被偶数个区间覆盖了,那么最终一定是 ,也就是差分数组是 ,那么我们连一条 的边,跑欧拉回路,根据边的方向加一减一一定是对的。
如果被奇数的区间覆盖,我们加一个区间 即可,注意需要离散化。
trick2#
- 特殊情况下解决哈密顿回路问题。
CF325E The Red Button#
首先容易证明 为奇数无解,否则令 。
关键性质, 拥有相同的入边,出边集合,其中 。也就是说这对点某种程度上可以看成一个点
那么我们建一个 个点的图,每个点实际代表一对点 。然后从 向 连边跑欧拉回路,正确性证明比较显然。
ZR2482 飞毯#
就是让你构造一个长度为 的 字符串使得本质不同子串数量最大。
首先我们找一下答案的上界,显然有一个: ,接下来我们证明可以取到它。
求出满足 最大的 ,那么我们只需要要求长度为 的串都出现,长度为 的串两两不同即可。
我们把每个长度为 的区间看成一个数,然后从 向 连边,现在我们需要在找一条长度为 的不经过重复点的路径,使得 至少出现一个。
考虑仿照上题做法构造一个 的点的哈密顿环,此时可以发现把这个环当成长度为 时, 恰好有一个已经确定出边了,那么因为出边集合相同,另一个也确定了。这样会形成若干个环,其中有一个长度为 的大环,并且 恰好一个在大环上。
注意假设 现在不在一个环上,交换 的出边可以使他们的环合并,那么我们不断合并环直到环长 ,此时因为之前的环长 且满足 至少出现了依次,我们只需要从之前的环的起点开始选,这样一定能把之前的环包上,就合法了。。
复杂度线性。
trick3#
- 一类与差的绝对值有关的最优化问题。
[IOI2016] railroad#
题意就是,你在数轴上游走,向左走代价为 ,向右走没有代价,还有 条有向特殊边必须经过恰好一次,问最优代价。
考虑最终你游走的过程,如果 走了 次,就连 条 的边, 同理,那么就是要求加最少代价的边使得存在欧拉路径。
路径是不太好处理的,注意到我们可以加一条 到 的边不影响答案,因此可以变成询问欧拉回路。
对于相邻两条边 ,我们求出它被特殊边覆盖的次数(从右向左是-1,从左向右是+1) ,如果 ,我们需要再加入 条向 的边,代价为 ,否则假如 的边,不需要代价。
这样加边显然是最优的,并且满足了欧拉回路的一个限制:所有点度数都是偶数。
但是还要联通才能有欧拉回路,于是我们还要加一些边使得图联通,显然只会加在相邻两点之间,一去一来。然后我们把这些边跑一个最小生成树使得图联通即可。
[省选联考 2020 B 卷] 丁香之路#
和上题大致相同,只是向左向右都有代价了,没有什么本质区别。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2023-02-24 2023/2/24 考试总结