# 高阶扩展:掩码图上的欧拉回路 ## 本节目标 从“最大化相邻连接的二进制低位相等数”推导出答案单调性,再把固定物件看成边、可粘合颜色看成点,用欧拉回路同时完成判定与构造。 ## 前置知识与课前自测 前置:无向欧拉回路、Hierholzer、位运算。 1. 两数 XOR 能被 $2^k$ 整除等价于哪 $k$ 位相同? 2. 若每个物件必须整体使用且可翻转,为什么它更像边而不是点? 3. 无向多重图存在覆盖全部边的欧拉回路需要什么条件?
答案 1. 最低 $k$ 位。 2. 物件有两个可交换端点,使用一次正好对应沿一条无向边走一次。 3. 所有非零度点连通且度数为偶数。
## 问题动机:先固定目标值 若直接排列 $n$ 个链节并决定每个链节朝向,搜索空间包含排列与 $2^n$ 次翻转。真正可利用的不是“美丽值”的数值,而是阈值判定:要求每次粘合美丽值至少为 $k$,等价于粘合的两种颜色最低 $k$ 位相同。 随着 $k$ 增大,条件只会变严。因此先解决“给定 $k$ 能否构造”,再从 20 向下找第一个可行值。 ## 精选例题:Johnny and Megan's Necklace ### 来源与题意 - VJudge:[CodeForces-1361C](https://vjudge.net/problem/CodeForces-1361C) - 原题:[Codeforces 1361C](https://codeforces.com/problemset/problem/1361/C) - 难度:2500;考点:二进制阈值、掩码多重图、欧拉构造 有 $n\le5\times10^5$ 个链节,第 $i$ 个两端颜色为 $a_i,b_i<2^{20}$。链节可翻转,并把所有端点两两粘合成一个环。一次粘合的美丽值是 $a\oplus b$ 的二进制末尾零数(相等时为 20);最大化所有粘合中的最小值,并输出链上 $2n$ 个原端点编号顺序。
Hint 1固定 $k$ 后只保留颜色 `color & ((1<<k)-1)`。
Hint 2一个链节连接两个掩码,应成为无向多重图的一条边。
Hint 3链节内部对应走过一条边;两个相邻链节的粘合处对应欧拉游走停在同一顶点。
Hint 4从 20 降序检查;第一个欧拉图直接用 Hierholzer 恢复每条边的方向。
### Observations 1. 只检查每个低位颜色出现偶数次还不够:两个互不相连的欧拉分量无法粘成一条项链。连通性与偶度缺一不可。 2. 固定 $k$ 后,原链节 $i$ 是边 $(a_i\bmod2^k,b_i\bmod2^k)$。链节可翻转正好对应无向边可沿任一方向经过。 3. 一条覆盖全部边的欧拉回路给出边序。相邻边共享的欧拉顶点意味着对应端点低 $k$ 位相同,因而粘合美丽值至少为 $k$。 4. 若某项链达到阈值 $k$,沿链节内部看边、沿粘合处看公共顶点,它反过来就是该掩码图的欧拉回路。因此模型不是仅充分,而是充要。 ### Editorial、证明与复杂度 对 $k=20,19,\ldots,0$,建立 $2^k$ 个掩码点和 $n$ 条链节边。检查所有度数为偶数,再从任一非零度点运行 Hierholzer;若最终使用边数少于 $n$,说明非零度部分不连通。 可行时,把欧拉回路中的有向经过记为 `from --edge i--> to`。若 `a_i` 的掩码等于 `from`,输出端点 `2i-1,2i`;否则反向输出。这样每一对输出位置是同一链节,而前一链节的末端与后一链节的首端都代表同一欧拉顶点。回路首尾同理。 上述双向对应证明判定充要;降序枚举的首个可行 $k$ 即最优值。每轮 $O(n+2^k)$,几何级数 $\sum2^k=O(2^{20})$,总时间 $O(20n+2^{21})$,空间 $O(n+2^{20})$。 ### 实现指南、核心伪代码与附件 ```text for k from 20 down to 0: mask = 2^k - 1 for each part i: add edge i between a[i]&mask and b[i]&mask if every degree is even: tour = Hierholzer from a nonzero-degree vertex if tour uses all n edges: orient every part by its traversal direction output k and the corresponding endpoint pairs stop ``` [完整 GNU C++17 实现](../../参考实现/01-欧拉路径/CodeForces-1361C.cpp) ## 扩展与联系 这一建模可推广到“固定二端物件必须全部串成一个环,接口只按等价类兼容”的问题:接口类作点、物件作边。若只需若干个环,连通性条件可删除,但答案会变成每个欧拉分量各造一环。 ### 实现细节与失效边界 - 必须按边编号判重;自环会在同一点邻接表出现两次,但只能使用一次。 - `k=0` 时只有一个掩码点,保证兜底可行。 - Hierholzer 得到的边常为逆序退出序,输出前应整体反转,不能只翻转每条边。 - 若目标改成最大化粘合美丽值之和,阈值单调性消失,欧拉可行性不再直接给最优。 ## 总结与自检 请独立证明“可行项链 $\Leftrightarrow$ 掩码图欧拉回路”,并手算一个偶度但不连通的反例。再回答:为什么从大到小枚举一定能找到最优阈值? ## 课后训练建议 先只输出最优 $k$,确认判定后再恢复端点方向;卡在构造 25 分钟后只看 Hint 3。完成后用随机小数据验证输出的端点恰好使用一次、链节成对且所有粘合低位相同。