1 条题解
-
0
C. MEX Cycle 题解(构造法)
题目简述
有 个龙围成一个环(相邻互为朋友),额外添加一条边 。需要构造一个数组 ,满足每个位置的值 = 其所有朋友对应值的 。
核心观察
- 图结构:
- 普通节点:度数为 (仅左右邻居);
- 节点 :度数为 (多了一个额外朋友)。
- MEX 关键性质:
- 邻居只有 → ;
- 邻居只有 → ;
- 邻居包含 和 → 。
我们的思路:用 0/1 交替填充数组,特殊位置赋值为 2,完美满足 MEX 规则。
代码构造逻辑
这是一道构造题,无需复杂算法,直接按规则构造答案即可:
- 以 为起点,生成 0/1 交替的序列;
- 满足特定条件时,将 位置设为 ;
- 该构造天然满足所有节点的 MEX 约束。
代码逐行解析
#include <iostream> #include <vector> using namespace std; void solve() { int n, x, y; cin >> n >> x >> y; --x; --y; // 转为 0 下标(方便数组操作) vector<int> ans(n); // 核心构造:以 x 为起点,0/1 交替填充整个环 for (int i = 0; i < n; ++i) ans[(x + i) % n] = i % 2; // 特殊条件:n 为奇数 或 x/y 奇偶性相同,将 x 设为 2 if (n % 2 || (x - y) % 2 == 0) ans[x] = 2; // 输出答案 for (auto x : ans)cout << x << ' '; cout << endl; } int main() { int T; cin >> T; while (T--) solve(); }关键代码解释
-
下标转换
--x; --y:将题目输入的 下标转为 下标,适配 C++ 数组。 -
0/1 交替构造
ans[(x + i) % n] = i % 2: 以 为起点,沿着环依次填充 ,保证相邻节点值一定不同。 -
特殊位置赋值 2
if (n % 2 || (x - y) % 2 == 0) ans[x] = 2:- 为奇数:环无法完美 0/1 交替,修正 为 ;
- 和 奇偶性相同:额外边 连接了同值节点,修正 为 。
-
输出 直接打印构造好的数组即可。
正确性证明
- 普通节点(度数 2): 邻居是 和 ,(或 0/1 交替满足规则);
- 特殊节点 (度数 3): 赋值为 ,其邻居包含 和 ,,完美匹配;
- 额外边 : 构造规则自动兼容这条边的约束。
题目保证一定有解,该构造是通用合法解。
复杂度分析
- 时间复杂度: 每组用例,总复杂度 ,完美适配 ;
- 空间复杂度: 存储答案数组。
总结
这是一道经典构造题,核心是利用 0/1 交替 + 特殊点修正 的简单策略,直接满足所有 MEX 约束,代码极简且效率拉满。
- 图结构:
- 1
信息
- ID
- 7128
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者