Official

D - Intersection of Cuboids Editorial by kyopro_friends


\(x\) 以上 \(y\) 以下の実数全体からなる区間」を \([x,y]\) と表します。

まずは \(1\) 次元の問題を考えてみましょう。

1 次元の問題

問題:2つの区間 \([a,b]\)\([c,d]\) の共通部分の長さが正であるかどうか判定してください。

判定方法は様々ありますが、単純な方法の \(1\) つは「共通部分の長さが \(0\) かどうか」を判定し、その否定を取ることです。 共通部分の長さが \(0\) になるのは、

  • \([a,b]\)\([c,d]\) より左側にある
  • \([a,b]\)\([c,d]\) より右側にある

のどちらかが起こるときです。よってこの判定はPython風のコードでは以下のように書けます。

if b <= c  or  d <= a:
  print("共通部分0")
else:
  print("共通部分正")

3 次元の問題

\(x,y,z\)\(3\) つの座標それぞれで \(1\) 次元の問題を解き、全てで共通部分の長さが正なら、直方体の共通部分の体積は正、そうでなければ \(0\) です。

なぜなら もし $x$ 座標の区間の共通部分の長さが $0$ なら、($1$ 次元の問題のときと同様に)一方の直方体は他方の"左側"にあるため、共通部分の体積は $0$ です。$y,z$ 座標についても同様です。
また逆に、$x,y,z$ 座標全ての区間の共通部分の長さが正なら、各座標がその範囲に含まれる点は直方体の共通部分に含まれることから、その体積は正です。

\(1\) 次元の問題を \(3\) 回解くことになるため、この部分を関数として分けるとシンプルに実装できます。

実装例(Python)

x1,y1,z1,x2,y2,z2 = map(int,input().split())
x3,y3,z3,x4,y4,z4 = map(int,input().split())

def f(l1,r1,l2,r2):
  # [l1,r1] と [l2,r2] の共通部分の長さが正ならTrue
  return not (r1<=l2 or r2<=l1)

if f(x1,x2,x3,x4) and f(y1,y2,y3,y4) and f(z1,z2,z3,z4):
  print("Yes")
else:
  print("No")

posted:
last update: