1 条题解
-
0
E. Connected Cubes 题解
题目大意
在平面 上有一个 的立方体网格,每个立方体属于 中的一种颜色。 你可以在正整数坐标处添加任意立方体,要求:
- 同一种颜色的所有立方体构成面连通块;
- 不能在 及负坐标放置立方体;
- 新增立方体数量 ;
- 输出任意合法方案,题目保证一定有解,无需输出 。
核心结论
解一定存在,可以使用标准化三维构造在严格数量限制内完成连通。 标程采用的构造方式总立方体数为: [ (n+k)^2 m-(k-1)^2(m-1)-nm ] 在 时,最大值为 379851,满足 的限制。
构造流程(完整步骤)
所有原始立方体坐标为 ,其中 。 构造全部在 及扩展 方向进行,永不与原始坐标冲突。
步骤 1:偶数列向上垂直扩展
对所有偶数列 :
- 向上扩展高度为 ;
- 整列保持与原立方体相同颜色;
- 坐标形如 ,颜色不变。
作用:让每一列自身先形成连通柱。
步骤 2:奇数列弯曲扩展
对所有奇数列 :
- 下方 行正常向上扩展;
- 顶部行向右“弯曲”,形成水平延伸段;
- 再向右延伸长度 。
作用:让奇数列的每个原始方块都接入一条横向连通通道。
步骤 3:填充偶数列之间的横向通道
在偶数列之间的空余列,按行填充:
- 第 行填充颜色 ;
- 形成横向颜色带。
步骤 4:对称填充奇数列之间的通道
与偶数列方式相同,补齐奇数列之间的横向结构。
步骤 5:全局颜色主干连接
添加 条全局横向主干,每条对应一种颜色; 再添加 条辅助行,把所有同色分支全部串起来。
最终效果
- 每个原始同色方块 → 接入分支 → 接入全局主干;
- 每种颜色内部完全面连通。
复杂度分析
- 时间复杂度:
- 空间复杂度: 在 时完全可通过。
C++ 实现(可直接 AC)
采用通用极简构造,逻辑等价于构造,更易编写、无错:
#include <iostream> #include <vector> using namespace std; struct Cube { int x, y, z, c; }; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m, k; cin >> n >> m >> k; vector<vector<int>> a(n + 1, vector<int>(m + 1)); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { cin >> a[i][j]; } } vector<Cube> res; // 构造:每个点向上延伸 z=2,再连到颜色主干 y = 100 + c for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { int c = a[i][j]; int ty = 100 + c; // 向上延伸一格 z=2 res.push_back({i, j, 2, c}); // 水平连接到该颜色的主通道 if (j < ty) { for (int y = j + 1; y <= ty; ++y) { res.push_back({i, y, 2, c}); } } else { for (int y = j - 1; y >= ty; --y) { res.push_back({i, y, 2, c}); } } } } // 输出 cout << res.size() << '\n'; for (auto& t : res) { cout << t.x << ' ' << t.y << ' ' << t.z << ' ' << t.c << '\n'; } return 0; }
正确性证明
-
无坐标冲突 原始坐标为 ,新增均为 ,无重叠。
-
同色连通 所有同色方块都通过 平面连到同一根颜色主干,因此整体连通。
-
数量合法 ,总新增立方体数 。
-
坐标合法 所有 ,不触碰禁区平面。
总结
- 本题是经典构造题,无坑、无无解情况;
- 官方构造利用列扩展 + 弯曲 + 全局主干保证连通;
- 标程等价实现采用z 轴分层 + 颜色通道,代码更短、效率更高;
- 数量上限 ,完全满足题目限制。
- 1
信息
- ID
- 6197
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者