解题思路:
1,先根据 点point 的 x 求出 直线的 y ,再判断 点point 的 y 在直线上面还是下面。
2,假设该点在直线的上面,判断该点是 A 类型,还是 B 类型。若为A类型,则上面区域不可再出现B类型。
# 输入点 n 和 查询的个数 m
n,m = map(int,input().split())
#输入n个点的横纵 ,坐标 和 类型
point = [[i for i in input().split()] for j in range(n)]
#输入直线的三个参数 a + bx + cy = 0
line = [[i for i in map(int,input().split())] for j in range(m)]
for i in range(m):
aa = 0
bb = 0
cc = 0
dd = 0
for j in range(n):
point[j][0] = int(point[j][0]) #把点的横坐标x转为整数型
point[j][1] = int(point[j][1]) #把点的纵坐标y转为整数型
#直线的参数 b,和 c 有可能为 0 ,导致没有直线的 x 或者 y,所以要分类讨论
if line[i][2] != 0: # 当线的参数 c 不为 0 ,即有参数 y 时
y = -(line[i][0] + line[i][1] * point[j][0]) / line[i][2] # 根据对应点point的x,求出直线的y
if point[j][1] > y:
if point[j][2] == 'A':
aa += 1 #若是A类型aa则不再是0
else:
bb += 1
else: #若上面的bb == 0,则代表在直线是上方都是A类型,但不代表直线的下方都是B类型,所以要分类讨论,当下面的dd=0时,则代表下方没有A类型,即全是B类型
if point[j][2] == 'A':
cc += 1
else:
dd += 1
else: # 当线的参数 c 为 0 ,即没有参数 y 时,求参数 x
x = -(line[i][0] + line[i][2] * point[j][1]) / line[i][1]
if point[j][0] < x:
if point[j][2] == 'A':
aa += 1
else:
bb += 1
else:
if point[j][2] == 'A':
cc += 1
else:
dd += 1
if aa == 0 and dd == 0 :
print('Yes')
elif bb == 0 and cc == 0:
print('Yes')
else:
print('No')