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: Wrong Answer)

import java.awt.geom.Rectangle2D;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Main {
	private	static	BufferedReader br = null;

	static {
		br = new BufferedReader(new InputStreamReader(System.in));
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		double[][]	aRect = null;

		while((aRect = parseRect()) != null) {
			result(aRect);
		}
	}

	private static double[][] parseRect() {
		double[][]	aRect = null;
		String[]	as    = null;

		try {
			String line = br.readLine();
			if (line != null) {
				if (!line.isEmpty()) {
					aRect       = new double[4][2];	
					as          = line.split(" ");
					aRect[0][0] = Double.parseDouble(as[0]);
					aRect[0][1] = Double.parseDouble(as[1]);
					aRect[1][0] = Double.parseDouble(as[2]);
					aRect[1][1] = Double.parseDouble(as[3]);
					aRect[2][0] = Double.parseDouble(as[4]);
					aRect[2][1] = Double.parseDouble(as[5]);
					aRect[3][0] = Double.parseDouble(as[6]);
					aRect[3][1] = Double.parseDouble(as[7]);
				}
			}
		}
		catch (NumberFormatException e) {}
		catch (IOException e) {}

		return aRect;
	}

	private static void result(double[][] aRect) {
		boolean					bin  = false;
		Rectangle2D.Double[]	rect = new Rectangle2D.Double[2];
		double[][]				dot  = {
				{ aRect[2][0], aRect[2][1] },
				{ aRect[2][0], aRect[3][1] },
				{ aRect[3][0], aRect[3][1] },
				{ aRect[3][0], aRect[2][1] },
				{ aRect[0][0], aRect[0][1] },
				{ aRect[0][0], aRect[1][1] },
				{ aRect[1][0], aRect[1][1] },
				{ aRect[1][0], aRect[0][1] },
		};

		rect[0] = new Rectangle2D.Double();
		rect[1] = new Rectangle2D.Double();

		rect[0].setRect(aRect[0][0], aRect[0][1], aRect[1][0] - aRect[0][0], aRect[1][1] - aRect[0][1]);
		rect[1].setRect(aRect[2][0], aRect[2][1], aRect[3][0] - aRect[2][0], aRect[3][1] - aRect[2][1]);

		for (int n = 0; n < dot.length && !bin; n++) {
			switch (n / 4) {
			case 0:
				bin = (rect[0].outcode(dot[n][0], dot[n][1]) == 0);
				break;
			case 1:
				bin = (rect[1].outcode(dot[n][0], dot[n][1]) == 0);
				break;
			}
		}

		if (bin) {
			System.out.println("YES");
		}
		else {
			System.out.println("NO");
		}
	}
}