#include #include using namespace std; typedef long long ll; #define INF 0x3f3f3f3f #define maxn 505 int n,m,dis[maxn][maxn]; struct node { int x,y; }A[maxn],B[maxn]; //判断c和ab的相对位置,-1表示c在ab左边,0表示c在ab上,1表示c在ab右边 int mul(node a,node b,node c) { int x=b.x-a.x,y=b.y-a.y,xx=c.x-a.x,yy=c.y-a.y; ll temp=(ll)x*yy-(ll)xx*y; if(temp>0)return -1; else if(temp==0)return 0; else return 1; } int main() { while(~scanf("%d",&n)) { for(int i=1;i<=n;i++)scanf("%d%d",&A[i].x,&A[i].y); scanf("%d",&m); for(int i=1;i<=m;i++)scanf("%d%d",&B[i].x,&B[i].y); for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) dis[i][j]=INF; for(int i=1;i<=m;i++) for(int j=i+1;j<=m;j++) { //flag表示i和j是否要连边,type表示单向还是双向 int flag=1,type=0; for(int k=1;k<=n;k++) { int temp=mul(B[i],B[j],A[k]); if(!temp) { if(min(B[i].x,B[j].x)<=A[k].x&&max(B[i].x,B[j].x)>=A[k].x)continue; flag=0; break; } if(type==0)type=temp; else if(type!=temp) { flag=0; break; } } if(flag) { if(type==-1)dis[i][j]=1; else if(type==1)dis[j][i]=1; else dis[i][j]=dis[j][i]=1; } } for(int k=1;k<=m;k++) for(int i=1;i<=m;i++) if(dis[i][k]!=INF) for(int j=1;j<=m;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); int ans=INF; for(int i=1;i<=m;i++)ans=min(ans,dis[i][i]); if(ans==INF)printf("ToT\n"); else printf("%d\n",m-ans); } return 0; }