実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 299
問題概要
空間内において2点 を結ぶ線分を対角線とし、全ての面が 平面上のいずれかに平行な直方体を と書く。2つの直方体 が与えられるので、これらの共通部分の体積が正であるかを判定せよ。
制約
- 入力はすべて整数。
考察
サンプルケース1のところに図が掲載されているので多少考えやすいが、やはり空間上で物事を考えると混乱しやすい。ここは次元を落として1次元の問題として次を考えてみよう。
- 軸上に2点 を結ぶ線分を と書く。2つの線分 が共通部分を持つか判定せよ () 。
これは絵を描いて を固定したうえで を左右に動かしてみればすぐに解決する。2つの線分の左側と右側の点それぞれに注目し、 としたとき、
- 共通部分を持つ
- 共通部分を持たない
と定式化できる。
同じことを 軸に対しても行えばよい。実装に関してはコードを参照のこと。
コード
#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 x1 = max(a, g); int y1 = max(b, h); int z1 = max(c, i); int x2 = min(d, j); int y2 = min(e, k); int z2 = min(f, l); if (x1 < x2 && y1 < y2 && z1 < z2) { cout << "Yes" << endl; } else { cout << "No" << endl; } }
実装時間: 5分
幾何に関する問題、特に3次元のものはバグらせがちなのでめっちゃヒヤヒヤする。今回はすんなり解けてよかった...