Problem:
長方形の重なり

底辺が x 軸に対して平行な 2 つの長方形があります。長方形 A の左下の座標 (xa1, ya1) と右上の座標 (xa2, ya2)、長方形 B の左下の座標 (xb1, yb1) と右上の座標 (xb2, yb2) を読み込んで、長方形 A と長方形 B が一部でも重なっていれば YES を、まったく重なっていなければ NO を出力するプログラムを作成してください。ただし、長方形 A と長方形 B は同じものではないとします。また、接しているものも重なっているとみなします。

Input

複数のデータセットが与えられます。各データセットの形式は以下のとおりです。

xa1 ya1 xa2 ya2 xb1 yb1 xb2 yb2

入力される値はそれぞれ -2,000 以上 2,000 以下であり、各値は小数点以下最大 5 桁までの数字を含む実数で与えられます。

データセットの数は 50 を超えません。

Output

各データセットに対して、YES または NO を１行に出力して下さい。

Sample Input

0.0 0.0 5.0 5.0 1.0 1.0 4.0 4.0
0.0 0.0 4.0 5.0 1.0 1.0 5.0 5.0
0.0 0.0 4.0 4.0 -3.0 -5.0 2.0 -1.0

Output for the Sample Input

YES
YES
NO

Solution in JAVA (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/**
 * Intersection of Rectangles
 */
public class Main {

	static Main main = new Main();

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = "";

		while ((line = br.readLine()) != null && !line.isEmpty()) {

			StringTokenizer st = new StringTokenizer(line);

			Point pa1 = main.new Point();
			Point pa2 = main.new Point();
			Point pb1 = main.new Point();
			Point pb2 = main.new Point();

			pa1.x = Double.parseDouble(st.nextToken());
			pa1.y = Double.parseDouble(st.nextToken());
			pa2.x = Double.parseDouble(st.nextToken());
			pa2.y = Double.parseDouble(st.nextToken());
			pb1.x = Double.parseDouble(st.nextToken());
			pb1.y = Double.parseDouble(st.nextToken());
			pb2.x = Double.parseDouble(st.nextToken());
			pb2.y = Double.parseDouble(st.nextToken());

			Rectangle r1 = main.new Rectangle(pa1, pa2);
			Rectangle r2 = main.new Rectangle(pb1, pb2);

			if (r1.intersect(r2)) {
				System.out.println("YES");
			} else {
				System.out.println("NO");
			}

		}

	}

	class Point {
		double x, y;

		Point() {

		}

		Point(double x, double y) {
			this.x = x;
			this.y = y;
		}
	}

	class Rectangle {

		Point[] points = new Point[4];

		Rectangle(Point p1, Point p3) {

			Point p2 = new Point(p3.x, p1.y);
			Point p4 = new Point(p1.x, p3.y);

			points[0] = p1;
			points[1] = p2;
			points[2] = p3;
			points[3] = p4;
		}

		boolean intersect(Rectangle other) {
			boolean result = false;
			if (!(result = intersect(this, other))) {
				result = intersect(other, this);
			}
			return result;
		}

		boolean intersect(Rectangle r1, Rectangle r2) {
			boolean result = false;
			for (Point p : r2.points) {
				if (r1.points[0].x <= p.x && p.x <= r1.points[2].x
						&& r1.points[0].y <= p.y && p.y <= r1.points[2].y) {
					result = true;
					break;
				}
			}
			if (!result) {
				if (r1.points[0].x <= r2.points[0].x
						&& r2.points[2].x <= r1.points[2].x
						&& r2.points[0].y <= r1.points[0].y
						&& r1.points[2].y <= r2.points[2].y) {
					result = true;
				}
			}
			if (!result) {
				if (r2.points[0].x <= r1.points[0].x
						&& r1.points[2].x <= r2.points[2].x
						&& r1.points[0].y <= r2.points[0].y
						&& r2.points[2].y <= r1.points[2].y) {
					result = true;
				}
			}
			return result;
		}

	}

}