/*
输入:n m 点的个数 查询的个数
2--n+1行输入n个点的信息(x,y,A)
n+2--n+m+1行输入m个查询
输出:m行,每行一个字符串:Yes No
*/
#include<stdio.h>
int x[10001],y[10001];
char c[10001];
int main()
{
int n,m,i,j,sum;
int A,B; //标记是否可以划分
int a0,a1,a2;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d%d %c",&x[i],&y[i],&c[i]);
}
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a0,&a1,&a2);
if(c[0]=='A') //由第一个点来标定A,B分别在直线的上方还是下方
{ //1为上方,-1为下方(用字符A,B更方便)
if(a0+a1*x[0]+a2*y[0]>0)
{
A=1,B=-1;
}
else
{
A=-1,B=1;
}
}
else
{
if(a0+a1*x[0]+a2*y[0]>0)
{
A=-1,B=1;
}
else
{
A=1,B=-1;
}
}
sum=1; //符合分类的点数
for(j=1;j<n;j++) //下标为0的点已经判断过了
{
if(c[j]=='A')
{
if(((a0+a1*x[j]+a2*y[j])*A)>0) //A已经有了确定的值,要么1要么-1,
sum++; //乘积为正,只能是1*1,-1*(-1)
else //说明,这种情况下是符合划分的。
break;
}
else if(c[j]=='B')
{
if(((a0+a1*x[j]+a2*y[j])*B)>0)
{
sum++;
}
else
{
break;
}
}
}
if(n==sum)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
这道题真的没有想出什么好的方法,可以说完全参考了这篇博客:
明天再做详细的解体说明吧。