2つの範囲の重なり判定を、より簡潔なコードで書くことがポイントになります。

「重なる」の反対である「重ならない」条件の方がより簡潔に書くことができ、以下の2通りになります。

  • 一方の範囲の終点が、他方の範囲の始点よりも前にある(端点を含む)
  • 一方の範囲の始点が、他方の範囲の終点よりも後にある(端点を含む)

以上の条件から、2つの範囲(a, b)と(c, d)の重なり判定の関数は以下のように書くことができます。

bool overlap(int a, int b, int c, int d){
  if ( d <= a ) return false; // (c, d)の終点が(a, b)の始点よりも前にある
  if ( b <= c ) return false; // (c, d)の始点が(a, b)の終点よりも後にある
  return true;
}

参考文献:4つの言語で解ける 実践プログラミング問題集