1 条题解
-
0
📝 题目大意
给定两个轴对齐长方体(所有面平行于坐标平面),分别由对角顶点 和 定义。判断两个长方体的交集体积是否为正。
💡 解题思路
-
题目分析:两个长方体都是轴对齐的(Axis-Aligned Bounding Box),且输入保证 以及 ,即给出的两个顶点分别是最小角点和最大角点。因此每个长方体在三个坐标轴上的投影就是一个区间,问题的核心转化为判断两个区间在三个轴上的交集是否都有正长度。
-
算法推导:
- 两个长方体相交当且仅当它们在 、、 三个轴上的投影区间都相交。
- 对于两个区间 和 ,它们的交集是 。交集长度大于 的条件是 (取
<而非<=是因为仅接触、体积为 不算正体积)。 - 同理,对 轴计算 与 ,对 轴计算 与 。
- 当三个轴上的交集长度都大于 时,交集体积 $(\min(d,j)-\max(a,g)) \times (\min(e,k)-\max(b,h)) \times (\min(f,l)-\max(c,i))$ 才为正,输出
Yes;否则输出No。
-
边界与细节:
- 关键坑点:判断条件必须是严格
<而非<=。样例 2 中两个长方体在 方向端面接触( 区间分别是 和 ),,交集长度 ,应输出No。若误用<=会输出Yes。 - 数据范围 ,坐标值很小,int 足够,不会溢出。
- 输入保证 等,无需自行排序顶点。
- 关键坑点:判断条件必须是严格
⏱️ 复杂度分析
- 时间复杂度:仅需计算三个 和三个 ,以及三次比较,共 的常数时间。
- 空间复杂度:仅使用了 12 个 int 变量存储坐标和 6 个临时变量,空间复杂度 。
💻 标准代码 (C++)
#include <iostream> #include <algorithm> using namespace std; int main() { int a, b, c, d, e, f; int g, h, i, j, k, l; cin >> a >> b >> c >> d >> e >> f; cin >> g >> h >> i >> j >> k >> l; // 交集在 x 轴上的区间 int x1 = max(a, g); // 左端点取两区间左端点的较大者 int x2 = min(d, j); // 右端点取两区间右端点的较小者 // 交集在 y 轴上的区间 int y1 = max(b, h); int y2 = min(e, k); // 交集在 z 轴上的区间 int z1 = max(c, i); int z2 = min(f, l); // 检查三个轴上的交集长度是否都大于 0(严格小于,不能等于) if (x1 < x2 && y1 < y2 && z1 < z2) { cout << "Yes" << endl; } else { cout << "No" << endl; } return 0; } -
- 1
信息
- ID
- 805
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者