#include #include #include #include #include #include #define N 1010 #define EPS 1e-10 #define INF 0x3f3f3f3f using namespace std; struct PO { double x,y; }p[N],s[N]; int n,m,dis[N][N]; inline int dc(double x) { if(x>EPS) return 1; else if(x<-EPS) return -1; return 0; } inline double cross(const PO &a,const PO &b,const PO &c) { return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y); } inline double dot(const PO &a,const PO &b,const PO &c) { return (b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y); } inline bool check(const PO &a,const PO &b) { for(int i=1;i<=n;i++) if(dc(cross(a,b,s[i]))<0) return false; return true; } inline void prep() { memset(dis,0x3f,sizeof dis); for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) { if(i==j) continue; if(check(p[i],p[j])) dis[i][j]=1; } } inline bool onpoint() { for(int i=1;i<=m;i++) { int cnt=0; for(int j=1;j<=n;j++) { if(dc(p[i].x-s[j].x)==0&&dc(p[i].y-s[j].y)==0) cnt++; else break; } if(cnt==n) return true; } return false; } inline bool onseg()//如果所有点共线,且没有一条线段包含他们所有点 { for(int i=3;i<=n;i++) if(dc(cross(s[1],s[2],s[i]))!=0) return false; for(int i=1;i<=m;i++) for(int j=i+1;j<=m;j++) { int cnt=0; for(int k=1;k<=n;k++) if(dc(dot(s[k],p[i],p[j]))<=0) cnt++; if(cnt==n) return false; } return true; } inline void go() { if(n==0) {printf("%d\n",m);return;} if(onpoint()) {printf("%d\n",m-1);return;} if(onseg()) {puts("ToT");return;} int ans=INF; prep(); for(int k=1;k<=m;k++) for(int i=1;i<=m;i++) if(dis[i][k]