直接发代码 mark一下
写的贼乱 将就着看
#include<algorithm>
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<string.h>
#define MAXN 1010
using namespace std;
int n,m,ok;
int theta0,theta1,theta2;
struct node
{
int x,y,type;
}p[MAXN];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
char c;
cin>>p[i].x>>p[i].y>>c;
p[i].type=c-'A';
}
for(int i=1;i<=m;i++)
{
cin>>theta0>>theta1>>theta2;
if(theta2 == 0)//分母是0
{
double split = -(double)(theta0) / theta1;
int flagA = -1,flagB = -1;
ok = 1;
for(int j = 1;j <= n;j++)
{
if(flagA == -1)//用一个点进行划分
{
if(p[j].type == 0)//A
{
if(p[j].x < split) flagA=0,flagB=1;//A在左侧 B在右侧
else flagA=1,flagB=0;//A在右侧 B在左侧
}
else//B
{
if(p[j].x < split) flagB=0,flagA=1;//B在左侧 A在右侧
else flagB=1,flagA=0;
}
}
//用划分好的判断之后的点对不对
if(p[j].type==0 && ((flagA == 0 && p[j].x > split) || (flagA == 1 && p[j].x < split)))//A
{ok=0;break;}
if(p[j].type==1 && ((flagB == 0 && p[j].x > split) || (flagB == 1 && p[j].x < split)))//B
{ok=0;break;}
}
}
else//theta2!=0
{
double k = -(double)(theta1) / theta2,b = -(double)(theta0) / theta2;
int flagA = -1,flagB = -1;
ok = 1;
for(int j = 1;j <= n;j++)
{
if(flagA == -1)//用一个点进行划分
{
if(p[j].type == 0)//A
{
if(p[j].y < p[j].x * k + b) flagA=0,flagB=1;//A在下侧 B在上侧
else flagA=1,flagB=0;
}
else//B
{
if(p[j].y < p[j].x * k + b) flagB=0,flagA=1;//B在下侧 A在上侧
else flagB=1,flagA=0;
}
}
//用划分好的判断之后的点对不对
if(p[j].type==0 && ((flagA == 0 && p[j].y > p[j].x * k + b) || (flagA == 1 && p[j].y < p[j].x * k + b)))//A
{ok=0;break;}
if(p[j].type==1 && ((flagB == 0 && p[j].y > p[j].x * k + b) || (flagB == 1 && p[j].y < p[j].x * k + b)))//B
{ok=0;break;}
}
}
if(ok == 1)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
system("pause");
return 0;
}