ABC223E - Placing Rectangles

「長方形が3つ」という点と「辺の長さが整数」という点がポイントです.

考え方

条件を満たす長方形が3つ存在したとする.

長方形が3つなので,ある一つの長方形は,辺を$x$軸 or $y$軸方向に目一杯延長しても他の2つの長方形と干渉しない.

そのような長方形を端に寄せて,残った長方形を2分割できるか考えればよい.

2分割の場合には,2つの長方形の辺を$x$軸 or $y$軸方向に目一杯延長できることに着目する.


以下を,「$X,Y$」「$A,B,C$」を入れ替えて全パターン試せば良い.

  1. 「面積$A$以上の長方形」の一辺を$X$として,もう一辺の長さを求める(Y2 =$\lceil A / X \rceil$).
  2. 以下を,「$X,Y2$」を入れ替えた2パターン試す(対称性から,$B,C$の入れ替えは不要).
    • 上で求めた「面積$A$以上の長方形」を除いた長方形を考える.この長方形に入れる「面積$B$以上の長方形」の一辺を$X$としてもう一辺の長さを求める(Y3 =$\lceil B / X \rceil$).
    • 面積B以上の長方形を除いて残った長方形の面積(X * (Y - Y3))が$C$以上ならTrue
  3. どれか一つでもTrueならYesを出力する.

【参考】【競プロ実況】ABC223 E問題【かつっぱ】 - YouTube

回答例

$\lceil a / x \rceil$は,(a + x - 1) // xでやるのが無難.math.ceil(a / x)だと通らないケースがあった(ケタが大きいから?見落としているケースが有る?).

a // x + bool(a % x)a // x + (a % x != 0)はOK.

X, Y, A, B, C = map(int, input().split())

def f(x, y, a, b, c):
  y2 = (a + x - 1) // x
  y -= y2
  if y > 0:
    return g(x, y, b, c) or g(y, x, b, c)
  else:
    return False

def g(x, y, b, c):
  y3 = (b + x - 1) // x
  y -= y3
  if x * y >= c:
    return True
  else:
    return False

ans = False
for x, y in [(X, Y), (Y, X)]:
  for a, b, c in [(A, B, C), (B, C, A), (C, A, B)]:
    ans |= f(x, y, a, b, c)
    
print('Yes' if ans else 'No')