#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; }