点击前往试题目录:https://blog.csdn.net/best335/article/details/99550556
题目废话太多,简化如下。
题意
在二维坐标系上有n个点,每个点有两种类型A或B。给定一条线 p1+p2x+p3y=0,问这条线是否能把平面上所有的点分为A、B两部分。
输入
第一行两个数:点的个数n,及查询的次数m
接下来n行,每行3个数,代表点的x轴位置,y轴位置,以及点的类型type。
接下来m行,每行3个数,代表线的三个参数。
输出
输出m行,对应m次查询。
若可分割两区域,输出"Yes",否则输出"No"。
解题思路
设 r = p1+p2x+p3y,只需要判断所有的rA、rB异号,且均!=0。
AC代码 c++11
#include<iostream>
#include<unordered_map>
#include<vector>
using namespace std;
int p1,p2,p3;
bool err;
int calc( unordered_map<int,vector<int> >& m){
if(err) return 0;
int flag = 0;
for(unordered_map<int,vector<int> >::iterator itX = m.begin();itX!=m.end();++itX){
const int &x = itX->first;
const vector<int> &ys = itX->second;
for(int i=0,ni=ys.size();i<ni;++i){
const int &y = ys[i];
int r = p1+p2*x+p3*y;
if(r!=0){
if(flag==0) flag = r;
else if(flag>0&&r<0||flag<0&&r>0) {
err = true;
return flag;
}
}
}
}
if(flag == 0) err=true;
return flag;
}
int main(){
int n,m,x,y;
char type;
unordered_map<int,vector<int> > A,B;
cin>>n>>m;
for(int i=0;i<n;++i){
cin>>x>>y>>type;
if(type=='A'){
A[x].push_back(y);
continue;
}
B[x].push_back(y);
}
for(int i=0;i<m;++i){
cin>>p1>>p2>>p3,err=false;
cout<<(calc(A)!=calc(B)&&!err?"Yes":"No")<<endl;
}
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
0 2 -3
-3 0 2
-3 1 1