http://acm.pku.edu.cn/JudgeOnline/problem?id=3304
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef long long LL;
#define mem(a, b) memset(a, b, sizeof(a))
/*
给出n条线段两个端点的坐标,问所有线段投影到一条直线上,
如果这些所有投影至少相交于一点就输出Yes!,否则输出No!
判是否存在直线,与n条线段相交
*/
const double eps = 1e-8;
struct Point{ double x,y; }; //点坐标
struct V{ Point start,endd; }; //两点式
double xmult(Point a,Point b,Point c) //(ca)×(cb)
{
return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
//判断两点在线的同侧,点在线上或异侧返回false
bool same_side(Point a,Point b,V line){
return xmult(line.start,a,line.endd)*xmult(line.start,b,line.endd) > eps;
}
//判断直线Line2与线段Line1相交,包括端点,不包括平行
bool seg_Line_intersect(V Line1,V Line2){
return !same_side(Line1.start,Line1.endd,Line2);
}
const int N = 110;
V line[N];
Point p[N*2];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&p[i+n].x,&p[i+n].y);
line[i].start = p[i];
line[i].endd = p[i+n];
}
int flag = 0;
for(int i = 1; i <= 2*n; i++){
for(int j = i+1; j <= 2*n; j++){
if(fabs(p[i].x-p[j].x)<=eps && fabs(p[i].y-p[j].y)<=eps)
continue;
V tmp;
tmp.start = p[i]; tmp.endd = p[j];
int f = 1;
for(int k = 1; k <= n; k++)
{
if(!seg_Line_intersect(line[k],tmp))
f = 0;
}
if(f){
flag = 1;
break;
}
}
}
if(flag) puts("Yes!");
else puts("No!");
}
return 0;
}