#include <bits/stdc++.h>
using namespace std;
const int N = 100000 + 10;
const int M = 1000000007;
const double eps = 1e-9;
const double PI = acos(-1);
const int oo = 1000000000;
typedef double TT;
struct point {
  TT x, y;
  point() : x(0), y(0) {}
  point(TT a, TT b) {
    x = a;
    y = b;
  }
  point operator+(const point& p) const { return point(x + p.x, y + p.y); }
  friend ostream& operator<<(ostream& os, const point& p) {
    return os << "(" << p.x << "," << p.y << ")";
  }
  point operator-(const point& p) const { return point(x - p.x, y - p.y); }
  bool operator<(const point& p) const {
    if (x - p.x) return x < p.x;
    return y < p.y;
  }
  bool operator==(const point& p) const { return x == p.x && y == p.y; }
  bool operator!=(const point& p) const { return !(*this == p); }
  void scan() { scanf("%lf%lf", &x, &y); }
  double len() { return sqrt(x * x + y * y); }
  double dist(const point& p) const { return (p - *this).len(); }
  point operator*(TT d) { return point(x * d, y * d); }
  point operator/(TT d) { return point(x / d, y / d); }
  TT operator*(const point& p) const { return x * p.x + y * p.y; }
  TT operator^(const point& p) const { return x * p.y - y * p.x; }
  double linePointDist(point a, point b, bool seg = false) {
    point c = *this;
    if (seg) {
      if ((b - a) * (c - b) > 0) return b.dist(c);
      if ((a - b) * (c - a) > 0) return a.dist(c);
    }
    return abs((b - a) ^ (c - a)) / a.dist(b);
  }
  void rotate(double theta, point Z = point(0, 0)) {
    TT ox = x - Z.x;
    TT oy = y - Z.y;
    x = ox * cos(theta) - oy * sin(theta) + Z.x;
    y = ox * sin(theta) + oy * cos(theta) + Z.y;
  }
};
double areaOfTri(point a, point b, point c) {
  point x = b - a;
  point y = c - a;
  return (x ^ y) / 2.0;
}
double areaOfPolygon(vector<point>& P) {
  TT area = 0;
  for (int i = 1; i < P.size() - 1; ++i)
    area += (P[i] - P[0]) ^ (P[i + 1] - P[0]);
  return abs(area / 2.0);
}
bool collinear(point a, point b, point c) { return areaOfTri(a, b, c) == 0; }
vector<point> x(4), y(4);
int main() {
  double mnx = oo, mxx = -oo, mny = oo, mxy = -oo;
  for (int i = 0; i < 4; ++i) {
    x[i].scan();
    mnx = min(mnx, x[i].x);
    mny = min(mny, x[i].y);
    mxx = max(mxx, x[i].x);
    mxy = max(mxy, x[i].y);
  }
  point dx((mnx + mxx) / 2, (mny + mxy) / 2);
  for (int i = 0; i < 4; ++i) y[i].scan();
  for (int i = 0; i < 4; ++i)
    if (y[i].x >= mnx && y[i].x <= mxx && y[i].y >= mny && y[i].y <= mxy)
      return cout << "YES", 0;
  double area = abs(areaOfPolygon(y));
  for (int i = 0; i < 4; ++i) {
    double cc = abs(areaOfTri(y[3], y[0], x[i]));
    for (int j = 1; j < 4; ++j) cc += abs(areaOfTri(y[j - 1], y[j], x[i]));
    if (abs(cc - area) < eps) return cout << "YES", 0;
  }
  double cc = abs(areaOfTri(y[3], y[0], dx));
  for (int j = 1; j < 4; ++j) cc += abs(areaOfTri(y[j - 1], y[j], dx));
  if (abs(cc - area) < eps) return cout << "YES", 0;
  cout << "NO";
  return 0;
}
