おじさんの競プロ記録

自分の力で解答できた問題を振り返り、理解を深めたいです。

AtCoder Regular Contest 051 A - 塗り絵

問題

問題文へ

中心({x_1,y_1})半径rの赤い円と、横の辺が{x_2~x_3}縦の辺が{y_2~y_3}の青い四角形があります。重なった部分は紫色になります。

赤い部分があれば1行目にYESで無ければNO、青い部分があれば2行目にYES無ければNOを出力します。

制約

  • -100 \leqq x_1,y_1 \leqq 100
  • -100 \leqq x_2 < x_3 \leqq 100
  • -100 \leqq y_2 < y_3 \leqq 100
  • {1 \leqq r \leqq 100}
  • 与えられる数はすべて整数である。

考えたこと

赤い部分がないというのは、赤い円が青い四角で完全に覆われた時です。青い部分についても同じです。

どちらかが相手を覆っていない時には、どちらも存在します。円と四角なのでどちらも存在しないということはありません。

赤い円で青い四角を覆っている場合は、四角の四隅の点が円に含まれるかでわかります。

青い四角で赤い円を覆っているかは、円の中心と半径を使って、x_2~x_3と比較すればわかります。

#define _GIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define all(v) v.begin(), v.end()
using namespace std;
using ll = long long;


int main(void) {
  int x1, y1, r;
  int x2, y2, x3, y3;
  cin >> x1 >> y1 >> r;
  cin >> x2 >> y2 >> x3 >> y3;

  // 赤い円に青い四角が含まれるか
  // 四角形の四隅を調べる
  if ((x1 - x2) * (x1 - x2) + (y1 - y3) * (y1 - y3) <= r * r &&
      (x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3) <= r * r &&
      (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) <= r * r &&
      (x1 - x3) * (x1 - x3) + (y1 - y2) * (y1 - y2) <= r * r) {
    cout << "YES" << endl;
    cout << "NO" << endl;
    return 0;
  } 

  // 青い四角に赤い円が含まれるか
  if (x2 <= x1 - r && x1 + r <= x3 &&
      y2 <= y1 - r && y1 + r <= y3) {
    cout << "NO" << endl;
    cout << "YES" << endl;
    return 0;
  }

  // それ以外はどちらの色も残る
  cout << "YES" << endl;
  cout << "YES" << endl;
  
  return 0;
}