Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- using namespace std;
- using ld = long double;
- const ld EPS = 0.1;
- // A <= B
- //
- class point {
- public:
- ld x, y;
- point() = default;
- point(ld x, ld y) {
- this->x = x;
- this->y = y;
- }
- };
- bool operator == (point A, point B) {
- return abs(A.x - B.x) < EPS && abs(A.y - B.y) < EPS;
- }
- class line {
- public:
- ld A, B, C;
- line() = default;
- line(point a, point b) {
- A = a.y - b.y;
- B = b.x - a.x;
- C = - A * a.x - B * a.y;
- }
- bool in(point x) const {
- return abs(A * x.x + B * x.y + C) < EPS;
- }
- };
- class segment {
- public:
- point a, b;
- segment() = default;
- segment(point a, point b) {
- this->a = a;
- this->b = b;
- }
- bool in(point x) const {
- if (a == b)
- return x == a;
- bool ch1 = (min(a.x, b.x) - x.x < EPS && x.x - max(a.x, b.x) < EPS) &&
- (min(a.y, b.y) - x.y < EPS && x.y - max(a.y, b.y) < EPS);
- bool ch2 = line(a, b).in(x);
- return ch1 && ch2;
- }
- };
- class triangle {
- public:
- point A, B, C;
- triangle() = default;
- triangle(point A, point B, point C) {
- this->A = A;
- this->B = B;
- this->C = C;
- }
- };
- ld dist(point a, point b) {
- return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
- }
- ld S(triangle t) {
- ld a = dist(t.A, t.B);
- ld b = dist(t.B, t.C);
- ld c = dist(t.A, t.C);
- ld p = (a + b + c) / 2.0;
- return sqrt(p * (p - a) * (p - b) * (p - c));
- }
- bool in(point x, triangle t) {
- ld S1 = S(t);
- ld S2 = S({x, t.A, t.B}) + S({x, t.B, t.C}) + S({x, t.A, t.C});
- bool ch1 = abs(S1 - S2) < EPS;
- bool ch2 = segment(t.A, t.C).in(x);
- bool ch3 = segment(t.A, t.B).in(x);
- bool ch4 = segment(t.C, t.B).in(x);
- return ch1 || ch2 || ch3 || ch4;
- }
- ld det(ld a, ld b, ld c, ld d) {
- return a * d - b * c;
- }
- pair<bool, point> intersect(line n, line m) {
- ld zn = det(m.A, m.B, n.A, n.B);
- if (abs(zn) < EPS)
- return {false, point()};
- point res;
- res.x = -det(m.C, m.B, n.C, n.B) / zn;
- res.y = -det(m.A, m.C, n.A, n.C) / zn;
- return {true, res};
- }
- bool intersect(segment a, segment b) {
- line la(a.a, a.b);
- line lb(b.a, b.b);
- auto inter = intersect(la, lb);
- if (!inter.first)
- return false;
- return a.in(inter.second) && b.in(inter.second);
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(0);
- #ifdef LOCAL
- freopen("input", "r", stdin);
- #endif
- //cout << "YES\n";
- //return 0;
- int x1, y1, a1, b1, x2, y2, a2, b2;
- cin >> x1 >> y1 >> a1 >> b1 >> x2 >> y2 >> a2 >> b2;
- point A1(x1, y1);
- point B1(x1 + a1, y1);
- point C1(x1, y1 + b1);
- point A2(x2, y2);
- point B2(x2 + a2, y2);
- point C2(x2, y2 + b2);
- triangle t1(A1, B1, C1), t2(A2, B2, C2);
- bool ans = false;
- ans |= in(A2, t1);
- ans |= in(B2, t1);
- ans |= in(C2, t1);
- ans |= in(A1, t2);
- ans |= in(B1, t2);
- ans |= in(C1, t2);
- if (!((t1.A == t1.B && t1.B == t1.C) || (t2.A == t2.B && t2.B == t2.C))) {
- ans |= intersect(segment(t1.A, t1.B), segment(t2.A, t2.B));
- ans |= intersect(segment(t1.A, t1.C), segment(t2.A, t2.B));
- ans |= intersect(segment(t1.B, t1.C), segment(t2.A, t2.B));
- ans |= intersect(segment(t1.A, t1.B), segment(t2.A, t2.C));
- ans |= intersect(segment(t1.A, t1.C), segment(t2.A, t2.C));
- ans |= intersect(segment(t1.B, t1.C), segment(t2.A, t2.C));
- ans |= intersect(segment(t1.A, t1.B), segment(t2.B, t2.C));
- ans |= intersect(segment(t1.A, t1.C), segment(t2.B, t2.C));
- ans |= intersect(segment(t1.B, t1.C), segment(t2.B, t2.C));
- }
- cout << (ans ? "YES\n" : "NO\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement