AtCoder ABC 361 B - Intersection of Cuboids (4Q, 灰色, 250 点) - けんちょんの競プロ精進記録

けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 361 B - Intersection of Cuboids (4Q, 灰色, 250 点)

「2 つの区間の交差している部分の長さ」を求める問題は典型。それが 3 次元になってもやることは一緒。

問題概要

3 次元空間内の直方体であって、2 点  (a,b,c),(d,e,f) を結ぶ線分を対角線とし、全ての面が xy 平面、yz 平面、zx 平面のいずれかに平行なものを  C(a,b,c,d,e,f) と表す。

2 つの直方体  C(a,b,c,d,e,f) C(g,h,i,j,k,l) の共通部分の体積が正の値であるかどうかを判定せよ。

制約

  •  0 \le a \lt d \le 1000
  •  0 \le b \lt e \le 1000
  •  0 \le c \lt f \le 1000
  •  0 \le g \lt j \le 1000
  •  0 \le h \lt k \le 1000
  •  0 \le i \lt l \le 1000

考えたこと:1 次元のとき

まず、1 次元の場合を考えよう。区間  \lbrack a, b) と区間  \lbrack c, d) の交差する箇所を求めたいときは、次のようにするのが定石だ。

  •  L = \max(a, c) (左端の max をとる)
  •  R = \min(b, d) (右端の min をとる)

として、 L \lt R であれば、交差部分は区間  \lbrack L, R) となる。 L \ge R のときは交差しないこととなる。

3 次元

3 次元になっても結局同様だ。x 座標、y 座標、z 座標それぞれについて、交差部分を表す区間を求めればよいのだ。

x 座標、y 座標、z 座標すべてについて、交差部分が存在していれば、直方体同士も交差すると判定できる。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a, b, c, d, e, f, g, h, i, j, k, l;
    cin >> a >> b >> c >> d >> e >> f >> g >> h >> i >> j >> k >> l;
    
    int lx = max(a, g), rx = min(d, j);
    int ly = max(b, h), ry = min(e, k);
    int lz = max(c, i), rz = min(f, l);
    
    if (lx < rx && ly < ry && lz < rz)
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
}