AtCoder Regular Contest 051 A - 塗り絵
問題
中心()半径rの赤い円と、横の辺が縦の辺がの青い四角形があります。重なった部分は紫色になります。
赤い部分があれば1行目にYESで無ければNO、青い部分があれば2行目にYES無ければNOを出力します。
制約
- -100 100
- -100 x_2 < x_3 100
- -100 y_2 < y_3 100
- 与えられる数はすべて整数である。
考えたこと
赤い部分がないというのは、赤い円が青い四角で完全に覆われた時です。青い部分についても同じです。
どちらかが相手を覆っていない時には、どちらも存在します。円と四角なのでどちらも存在しないということはありません。
赤い円で青い四角を覆っている場合は、四角の四隅の点が円に含まれるかでわかります。
青い四角で赤い円を覆っているかは、円の中心と半径を使って、と比較すればわかります。
#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; }