1 //凸包稳定性判断:每条边上是否至少有三点 2 // POJ 1228 3 4 #include <iostream> 5 #include <cstdio> 6 #include <cstdlib> 7 #include <algorithm> 8 #include <vector> 9 #include <math.h> 10 using namespace std; 11 #define LL long long 12 typedef pair<int,int> pii; 13 const double inf = 0x3f3f3f3f; 14 const LL MOD =100000000LL; 15 const int N =110; 16 #define clc(a,b) memset(a,b,sizeof(a)) 17 const double eps = 1e-8; 18 void fre() {freopen("in.txt","r",stdin);} 19 void freout() {freopen("out.txt","w",stdout);} 20 inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;} 21 22 int sgn(double x){ 23 if(fabs(x) < eps)return 0; 24 if(x < 0)return -1; 25 else return 1; 26 } 27 28 struct Point{ 29 double x,y; 30 Point(){} 31 Point(double _x,double _y){ 32 x = _x;y = _y; 33 } 34 Point operator -(const Point &b)const{ 35 return Point(x - b.x,y - b.y); 36 } 37 double operator ^(const Point &b)const{ 38 return x*b.y - y*b.x; 39 } 40 double operator *(const Point &b)const{ 41 return x*b.x + y*b.y; 42 } 43 friend bool operator<(const Point &a,const Point &b){ 44 if(fabs(a.y-b.y)<eps) return a.x<b.x; 45 return a.y<b.y; 46 } 47 friend double dis2(Point a){ 48 return a.x*a.x+a.y*a.y; 49 } 50 }; 51 52 double dis(Point a,Point b){ 53 return sqrt(dis2(a-b)); 54 } 55 56 int mult(Point a,Point b,Point o){ 57 return sgn((a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y)); 58 } 59 //返回top个点 60 int graham(Point p[],int n,Point q[]){ 61 int top=1; 62 sort(p,p+n); 63 if(n==0) return 0; 64 q[0]=p[0]; 65 if(n==1) return 1; 66 q[1]=p[1]; 67 if(n==2) return 2; 68 q[2]=p[2]; 69 for(int i=2;i<n;i++){ 70 while(top&&(mult(p[i],q[top],q[top-1])>0)) top--; 71 q[++top]=p[i]; 72 } 73 int len=top; 74 q[++top]=p[n-2]; 75 for(int i=n-3;i>=0;i--){ 76 while(top!=len&&(mult(p[i],q[top],q[top-1])>0)) top--; 77 q[++top]=p[i]; 78 } 79 return top; 80 } 81 82 // 判断凸包边上是否至少有三点 83 bool judge(Point p[],int m){ 84 p[m]=p[0]; 85 p[m+1]=p[1]; 86 for(int i=1;i<m;i++){ 87 if(mult(p[i-1],p[i+1],p[i])!=0&&mult(p[i],p[i+2],p[i+1])!=0) 88 return false; 89 } 90 return true; 91 } 92 93 94 Point p[1011]; 95 Point ch[1011]; 96 int main(){ 97 // fre(); 98 int T; 99 scanf("%d",&T); 100 while(T--){ 101 int n; 102 scanf("%d",&n); 103 for(int i=0;i<n;i++){ 104 double x,y; 105 scanf("%lf%lf",&x,&y); 106 p[i]=Point(x,y); 107 } 108 int m=graham(p,n,ch); 109 if(n<6) { 110 puts("NO"); 111 continue; 112 } 113 if(judge(ch,m)) puts("YES"); 114 else puts("NO"); 115 } 116 return 0; 117 }