思路:
numA表示A点的个数,numB表示B点的个数;
da表示在给定直线上方的A点个数,xa表示在给定直线下方的A点个数;
db表示在给定直线上方的B点个数,xb表示在给定直线下方的B点个数;
若A点全在直线上方,B点全在下方,或者A点全在下方,B点全在上方时,给定直线可完美分割A、B点。即numA == da && numB == xb || numA == xa && numB == db。
代码如下:
#include <iostream>
using namespace std;
class Point{
public:
int x;
int y;
char type;
};
int main(void){
int n,m,i,M;
int numA = 0,numB = 0,da,db,xa,xb;
int a,b,c;
int judge[25] = {0};
Point point[1010];
cin>>n>>m;
M = m;
for(i = 0;i < n; ++i){
cin>>point[i].x>>point[i].y>>point[i].type;
point[i].type == 'A'? numA ++:numB++;
}
while(m--){
cin>>a>>b>>c;
da = db = xa = xb = 0;
for(i = 0;i < n; ++ i){
if(point[i].type == 'A'){
if( (a + b * point[i].x + c * point[i].y) > 0 )da ++;
else xa ++;
}
if(point[i].type == 'B'){
if( (a + b * point[i].x + c * point[i].y) > 0 )db ++;
else xb ++;
}
}
if( (numA==da && numB == xb) || (numA==xa && numB == db) )judge[m + 1] = 1;
}
for(i = M;i > 0;-- i){
if(judge[i] == 1)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}