torus711 のアレ

主に競技プログラミングの問題について書きます.PC 以外だと数式が表示されないかもしれないです

ACL Beginner Contest, B : Integer Preference

問題概要

 整数上の閉区間 $[ A, B ]$ と $[ C, D ]$ の共通部分はあるか?

制約

  • $0 \leq A \leq B \leq 10^{ 18 }$
  • $0 \leq C \leq D \leq 10^{ 18 }$

解法

 下側の境界に着目すると「$A$ 以上かつ $C$ 以上の整数はあるか?」ということになり,半開区間 $[ \max( A, C ), \infty )$ に対応します.同様に上側は $( -\infty, \min( B, D ) ]$ に対応し,問題で問われている区間はこの共通部分,$[ \max( A, C ), \min( B, D ) ]$ です.この区間が空でないことは,$\max( A, C ) \leq \min( B, D )$ と同値です.
 $x > y$ のとき区間 $[ x, y ]$ が well-def なのかどうかという話が一瞬頭をよぎりますが,区間 $[ x, y ]$ を $\{ z \mid z \in \mathbb Z, x \leq z \leq y \}$ と定義してあげれば問題ありません.

コード

main = do
	[ a, b, c, d ] <- readIntegers
	let
		mi = max a c
		ma = min b d
	putStrLn $ which "Yes" "No" $ mi <= ma