#include <bits/stdc++.h>
using namespace std;
typedef struct SPoint {
  double X, Y;
  SPoint(double X = 0, double Y = 0) : X(X), Y(Y) {}
  double abs() { return sqrt(X * X + Y * Y); }
  double sqrAbs() { return X * X + Y * Y; }
} TPoint;
TPoint operator-(const TPoint& shl, const TPoint& shr) {
  return TPoint(shl.X - shr.X, shl.Y - shr.Y);
}
istream& operator>>(istream& is, TPoint& getPoint) {
  return is >> getPoint.X >> getPoint.Y;
}
const int MAX_POINT = 5;
const double ESP = 1e-8;
double squareOfRect;
TPoint outRect[MAX_POINT], inRect[MAX_POINT];
double squareOf(const TPoint& A, const TPoint& B, const TPoint& C) {
  double a = (B - C).abs();
  double b = (C - A).abs();
  double c = (A - B).abs();
  double p = (a + b + c) / 2;
  return sqrt(p * (p - a) * (p - b) * (p - c));
}
bool inSide(const TPoint& checkPoint) {
  double minX = 100, minY = 100, maxX = -100, maxY = -100;
  for (int i = 1; i <= 4; ++i) minX = min(minX, outRect[i].X);
  for (int i = 1; i <= 4; ++i) minY = min(minY, outRect[i].Y);
  for (int i = 1; i <= 4; ++i) maxX = max(maxX, outRect[i].X);
  for (int i = 1; i <= 4; ++i) maxY = max(maxY, outRect[i].Y);
  if (checkPoint.X < minX || checkPoint.X > maxX || checkPoint.Y < minY ||
      checkPoint.Y > maxY)
    return false;
  double square = 0;
  for (int i = 1; i <= 4; ++i)
    square += squareOf(checkPoint, outRect[i], outRect[i - 1]);
  return abs(square - squareOfRect) < ESP;
}
void checker() {
  outRect[0] = outRect[4];
  squareOfRect = (outRect[0] - outRect[1]).sqrAbs();
  for (int i = 1; i <= 4; ++i)
    if (inSide(inRect[i])) cout << "YES\n", exit(0);
  TPoint center((inRect[1].X + inRect[3].X) / 2,
                (inRect[1].Y + inRect[3].Y) / 2);
  if (inSide(center)) cout << "YES\n", exit(0);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  for (int i = 1; i <= 4; ++i) cin >> outRect[i];
  for (int i = 1; i <= 4; ++i) cin >> inRect[i];
  checker();
  swap(inRect, outRect);
  checker();
  cout << "NO\n";
  return 0;
}
