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.Point;
import java.awt.geom.*;
import java.awt.geom.Point2D.Double;
import java.util.*;
 
public class Main {
    Scanner sc = new Scanner(System.in);
 
    public static void main(String[] args) {
        new Main(); 
    }
 
    public Main() {
    	new aoj0059().doIt();
    }
    class aoj0059{
    	void doIt(){
    		while(sc.hasNext()){
    			boolean in = false;
    			Point2D p[] = new Point2D[4];
    			Point2D p2[] = new Point2D[4];
    			for(int i = 0;i < 2;i++){
    				p[i*2] = new Point2D.Double(sc.nextDouble(),sc.nextDouble());
    			}
    			p[1] = new Point2D.Double(p[0].getX(),p[2].getY());
    			p[3] = new Point2D.Double(p[2].getX(),p[0].getY());
    			for(int i = 0;i < 2;i++){
    				p2[i*2] = new Point2D.Double(sc.nextDouble(),sc.nextDouble());
    			}
    			p2[1] = new Point2D.Double(p2[0].getX(),p2[2].getY());
    			p2[3] = new Point2D.Double(p2[2].getX(),p2[0].getY());
    			for(int i = 0;i < 4;i++){
    				if(contains(p,p2[i]) >= 0)in = true;
    			}
    			if(in)System.out.println("YES");
    			else System.out.println("NO");
            }
    	}
    	int contains(Point2D[] plist,Point2D p) {
    		boolean isin = false;
    		int n = plist.length;
    		for(int i=0;i<n;i++){
    			Point2D a = sub(plist[i], p);
    			Point2D b = sub(plist[(i+1) % n], p);
    			if(a.getY() > b.getY()){
    				Point2D temp = (Point2D) a.clone();
    				a = b;
    				b = temp;
    			}
    			if(a.getY() <= 0 && 0 < b.getY()){
    				if(cross(a,b) < 0) isin = ! isin;
    			}
    			if(cross(a,b) == 0 && dot(a, b) <= 0) return 0;
    		}
    		return isin ? 1 : -1;
    	}
    	Point2D sub(Point2D p2, Point2D p1) {
            double x = p2.getX() - p1.getX();
            double y = p2.getY() - p1.getY();
            return new Point2D.Double(x, y);
    	}
    	double cross(Point2D p1, Point2D p2){
    		double res = p1.getX() * p2.getY() - p1.getY() * p2.getX();
    		return res;
    	}
    	double dot(Point2D p1,Point2D p2){
    		return p1.getX() * p2.getX() + p1.getY() * p2.getY();
    	}
    }
}