問題概要
整数上の閉区間 $[ 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