CCF认证考试题解目录
测试用例
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
C++题解
首先将AB分类保存,分别计算AB中的第一个元素位置,进行标示,检测同组的元素是否存在指向两侧的,在检测两组元素是不是在直线两侧。
#include <bits/stdc++.h>
using namespace std;
vector<int> A1,A2;
vector<int> B1,B2;
int main()
{
int N,M;
scanf("%d%d",&N,&M);
while(N--)
{
int x,y;
string C;
scanf("%d%d",&x,&y);
cin >> C;
if(C=="A")
{
A1.push_back(x);
A2.push_back(y);
}
else
{
B1.push_back(x);
B2.push_back(y);
}
}
while(M--)
{
bool haha = true;
int O1,O2,O3;
scanf("%d%d%d",&O1,&O2,&O3);
int AA = 0, BB = 0 ;
if(O1 + A1[0] * O2 + A2[0] * O3 > 0 ) AA = 1;
else AA = -1;
for(int i = 1; i < A1.size(); i++)
{
if(O1 + A1[i] * O2 + A2[i] * O3 < 0 && AA == 1) haha =false;
if(O1 + A1[i] * O2 + A2[i] * O3 > 0 && AA == -1) haha =false;
}
if(O1 + B1[0] * O2 + B2[0] * O3 > 0 ) BB = 1;
else BB = -1;
for(int i = 1; i <B1.size(); i++)
{
if(O1 + B1[i] * O2 + B2[i] * O3 < 0 && BB == 1) haha =false;
if(O1 + B1[i] * O2 + B2[i] * O3 > 0 && BB == -1) haha =false;
}
if(haha)
{
if(AA*BB<0)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
else
{
printf("No\n");
}
}
return 0;
}