题意:判断一条直线是否把两类点分开。
思路:两个点判断一下是否和直线相交,然后分类讨论。 判断线段和直线相交可以用kuangbin板子,我解斜截式直线方程,分斜率是否存在讨论。
/* Author : Rshs */
#include<bits/stdc++.h>
using namespace std;
#define FI first
#define SE second
#define LL long long
#define LDB long double
#define MP make_pair
#define PII pair<int,int>
#define SZ(a) (int)a.size()
#define DB1(a) cerr<<(#a)<<'='<<a<<endl
#define DB2(a,b) cerr<<(#a)<<'='<<a<<' '<<(#b)<<'='<<b<<endl
#define DB3(a,b,c) cerr<<(#a)<<'='<<a<<' '<<(#b)<<'='<<b<<' '<<(#c)<<'='<<c<<endl
const LDB pai = acos(-1.0L);
const LDB eps = 1e-10;
const LL mod = 1e9+7;
const int MXN = 1e6+5;
inline int Add(int x,int y){return (x+=y)>=mod?x-mod:x;}
inline int Sub(int x,int y){return (x-=y)<0?x+mod:x;}
inline int Mul(int x,int y) {return 1LL*x*y%mod;}
inline int Pow(int x,LL y){int res=1;while(y){if(y&1)res=1LL*res*x%mod;x=1LL*x*x%mod;y>>=1;}return res;}
vector<PII>A,B;
double ddd(double a,double b,double c,double d){
return sqrt((c-a)*(c-a)+(b-d)*(b-d));
}
int ju(double a,double b,double c,double d,double kk,double bb){
if(a==c){
double yy=kk*a+bb;
double dis=max(abs(b-yy),abs(d-yy));
double dd=abs(d-b);
if(dd>dis) return 0;
return 1;
}
double k1=(d-b)/(c-a);
double b1=(b)-k1*a;
double xx=(b1-bb)/(kk-k1);
double yy=kk*xx+bb;
double dis=max(ddd(xx,yy,a,b),ddd(xx,yy,c,d));
double dd=ddd(a,b,c,d);
if(dd>dis) return 0;
return 1;
}
int main(){
int n,Q;scanf("%d%d",&n,&Q);
for(int i=1;i<=n;i++){
int sa,sb;scanf("%d %d",&sa,&sb);
string s;cin>>s;
if(s[0]=='A')A.push_back(MP(sa,sb));
if(s[0]=='B')B.push_back(MP(sa,sb));
}
while(Q--){
int c0,c2,c1;scanf("%d%d%d",&c0,&c1,&c2);
if(c2==0){
double u=-1.0*c0/c1,cal=0,cbl=0;
for(auto i:A){
if(i.FI<u)cal++;
}
for(auto i:B){
if(i.FI<u)cbl++;
}
if(cal==0&&cbl==SZ(B)){
puts("Yes");
}
else if(cbl==0&&cal==SZ(A)){
puts("Yes");
}
else {
puts("No");
}
continue;
}
double k=-1.0*c1/c2;
double b=-1.0*c0/c2;
int sj=0;
for(int i=0;i<SZ(A);i++){
for(int j=i+1;j<SZ(A);j++){
sj=sj+(ju(A[i].FI,A[i].SE,A[j].FI,A[j].SE,k,b)==0);
}
}
for(int i=0;i<SZ(B);i++){
for(int j=i+1;j<SZ(B);j++){
sj=sj+(ju(B[i].FI,B[i].SE,B[j].FI,B[j].SE,k,b)==0);
}
}
if(sj){
puts("No");
continue;
}
if(ju(A[0].FI,A[0].SE,B[0].FI,B[0].SE,k,b)==1){
puts("No");
continue;
}
puts("Yes");
}
return 0;
}
/*
9 3
1 1 A
1 0 A
1 -1 A
2 2 B
2 3 B
0 1 A
3 1 B
1 3 B
2 0 A
*/
在这里插入代码片