Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

凸？

平面上の異なる 4 点　$A (x_a, y_a)$, $B (x_b, y_b)$, $C (x_c, y_c)$, $D(x_d, y_d)$ の座標を読み込んで、それら 4 点を頂点とした四角形 $ABCD$ に凹みがなければ YES、凹みがあれば NO と出力するプログラムを作成してください。

凹みのある四角形とは図 1 のような四角形です。

Input

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

$x_a$,$y_a$,$x_b$,$y_b$,$x_c$,$y_c$,$x_d$,$y_d$

$x_a$, $y_a$, $x_b$, $y_b$, $x_c$, $y_c$, $x_d$, $y_d$ はそれぞれ -100 以上 100 以下であり、実数で与えられます。

1 直線上に 3 つ以上点が並ぶことはないものとします。また、入力順に点を結んでいけば、四角形になる順番に点の座標が入力されるものとします。（つまり、図 2 のような形になる順番で点が与えられることはありません。)

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

Output

各データセットごとに、YES または NO を１行に出力します。

Sample Input

0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0
0.0,0.0,3.0,0.0,1.0,1.0,1.0,3.0

Output for the Sample Input

YES
NO

Solution in JAVA (judge verdict: Wrong Answer)

import java.util.Scanner;
import java.io.*;

public class Main{
	public static String solve(double[] p){
		double a = p[4]-p[0]; //  c-a
		double b = p[6]-p[2]; //  g-e
		double c = p[5]-p[1]; //  d-b
		double d = p[7]-p[3]; //  h-f
		double e = p[3]+p[1]; //  f+b
		
		if( a == 0 ){
			double key = (d/b)*(p[0]-p[2])+p[3];
			if( (key-p[1])*(key-p[5]) < 0 && (p[0]-p[2])*(p[0]-p[6]) < 0 ){
				return "YES";
			} else {
				return "NO";
			}
		} else if( b == 0 ){
			double key = (c/a)*(p[2]-p[0])+p[1];
			if( (key-p[3])*(key-p[7]) < 0 && (p[2]-p[0])*(p[2]-p[4]) < 0 ){
				return "YES";
			} else {
				return "NO";
			}
		} else {
			double key = (a*b*e+p[2]*a*d-p[0]*c*b)/(a*d-c*b);
			if( (key-p[0])*(key-p[4]) < 0 && (key-p[2])*(key-p[6]) < 0 ){
				return "YES";
			} else {
				return "NO";
			}
		}
	}
			
	public static void main(String[] args) throws IOException{
		Scanner stdIn = null;
		String[] result = new String[10000];
		int index = 0;
		
		try{
			stdIn = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
			while( stdIn.hasNext() ){
				String str = stdIn.next();
				String[] s = str.split(",");
				double[] p = new double[s.length];
				for(int i = 0; i < s.length; i++){
					p[i] = Double.parseDouble(s[i]);
				}
				result[index] = solve(p);
				index++;
			}
			for(int i = 0; i < index; i++){
				System.out.println(result[i]);
			}
		} finally {
			if( stdIn != null ){
				stdIn.close();
			}
		}
	}
}