1 条题解

  • 0
    @ 2026-6-19 10:30:55

    📝 题目大意

    给定两个轴对齐长方体(所有面平行于坐标平面),分别由对角顶点 (a,b,c)(d,e,f)(a,b,c)(d,e,f)(g,h,i)(j,k,l)(g,h,i)(j,k,l) 定义。判断两个长方体的交集体积是否为正。

    💡 解题思路

    1. 题目分析:两个长方体都是轴对齐的(Axis-Aligned Bounding Box),且输入保证 a<d, b<e, c<fa<d,\ b<e,\ c<f 以及 g<j, h<k, i<lg<j,\ h<k,\ i<l,即给出的两个顶点分别是最小角点和最大角点。因此每个长方体在三个坐标轴上的投影就是一个区间,问题的核心转化为判断两个区间在三个轴上的交集是否都有正长度。

    2. 算法推导

      • 两个长方体相交当且仅当它们在 xxyyzz 三个轴上的投影区间都相交。
      • 对于两个区间 [a,d][a,d][g,j][g,j],它们的交集是 [max(a,g), min(d,j)][\max(a,g),\ \min(d,j)]。交集长度大于 00 的条件是 max(a,g)<min(d,j)\max(a,g) < \min(d,j)(取 < 而非 <= 是因为仅接触、体积为 00 不算正体积)。
      • 同理,对 yy 轴计算 max(b,h)\max(b,h)min(e,k)\min(e,k),对 zz 轴计算 max(c,i)\max(c,i)min(f,l)\min(f,l)
      • 当三个轴上的交集长度都大于 00 时,交集体积 $(\min(d,j)-\max(a,g)) \times (\min(e,k)-\max(b,h)) \times (\min(f,l)-\max(c,i))$ 才为正,输出 Yes;否则输出 No
    3. 边界与细节

      • 关键坑点:判断条件必须是严格 < 而非 <=。样例 2 中两个长方体在 zz 方向端面接触(zz 区间分别是 [0,2][0,2][2,4][2,4]),max(0,2)=2, min(2,4)=2\max(0,2)=2,\ \min(2,4)=2,交集长度 00,应输出 No。若误用 <= 会输出 Yes
      • 数据范围 0a,b,c,d,e,f,g,h,i,j,k,l10000 \leq a,b,c,d,e,f,g,h,i,j,k,l \leq 1000,坐标值很小,int 足够,不会溢出。
      • 输入保证 a<da<d 等,无需自行排序顶点。

    ⏱️ 复杂度分析

    • 时间复杂度:仅需计算三个 max\max 和三个 min\min,以及三次比较,共 O(1)O(1) 的常数时间。
    • 空间复杂度:仅使用了 12 个 int 变量存储坐标和 6 个临时变量,空间复杂度 O(1)O(1)

    💻 标准代码 (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
    上传者