2020 06-1 线性分类器
题解来源链接
#include <bits/stdc++.h>
using namespace std;
using gg = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
gg ni, mi;
cin >> ni >> mi;
vector<vector<array<gg, 2>>> points(2);
gg xi, yi, ai, bi, ci;
string typei;
while (ni--) {
cin >> xi >> yi >> typei;
points[typei[0] - 'A'].push_back({xi, yi});
}
while (mi--) {
cin >> ai >> bi >> ci;
for (auto& p : points) {
for (gg i = 1; i < p.size(); ++i) {
if ((ai + bi * p[i][0] + ci * p[i][1] > 0) ^ (ai + bi * p[0][0] + ci * p[0][1] > 0)) {
cout << "No\n";
goto loop;
}
}
}
cout << "Yes\n";
loop:;
}
return 0;
}
笔记
- vector初始化的方式,见本篇博客。
- 注意,把array<int,2>看做基本类型int会更好理解,
- string类型,即使只会碰到单个字符’A’或者’B’,也定义成string类型,然后取string[0];代码points[typei[0] - ‘A’].push_back({xi, yi});首先points[]定位到vector<array<int,2>>,然后push_back{{xi, yi}}向vector push一个array<int,2>。
- 利用’A’-‘A’ = 0, ‘B’ - ‘A’ = 1来索引数组。
- 在下述代码中,首先for (auto& p : points)定位到vector<array<int,2>>,然后 for (gg i = 1; i < p.size(); ++i)定位到某个array<int,2>。即前者是关于A,B两类点,后者是某一类点中的点。
while (mi--) {
cin >> ai >> bi >> ci;
for (auto& p : points) {
for (gg i = 1; i < p.size(); ++i) {
if ((ai + bi * p[i][0] + ci * p[i][1] > 0) ^ (ai + bi * p[0][0] + ci * p[0][1] > 0)) {
cout << "No\n";
goto loop;
}
}
}
cout << "Yes\n";
loop:;
- if ((ai + bi * p[i][0] + ci * p[i][1] > 0) ^ (ai + bi * p[0][0] + ci * p[0][1] > 0)) {
cout << “No\n”;
由于已经进入到A类或者B类中的具体点,所以看它是否同号即可,如果异号,则打印“No”,反之goto到打印Yes之后。
这里的抑或用的很准。