A~E 个人题解
A
向量的数量积为零
#include <iostream>
using namespace std;
int main() {
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
cout<<(x1*x2+y1*y2 == 0 ? "Yes" : "No")<<'\n';
return 0;
}
B
排序 枚举
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n,x,y;
cin>>n;
vector<int> a,b;
for (int i=1; i<=n; i++) {
cin>>x>>y;
if (x == 0)
b.push_back(y);
if (y == 0)
a.push_back(x);
}
sort(a.begin(), a.end());
sort(b.begin(), b.end());
int cnt = 0;
for (int i=1; i<a.size(); i++)
cnt += a[i] - a[i-1] == 1;
for (int i=1; i<b.size(); i++)
cnt += b[i] - b[i-1] == 1;
cout<<cnt<<'\n';
return 0;
}
C
让三角形的底边与坐标轴平行且长度为偶数即可
#include <iostream>
using namespace std;
int main() {
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
if (x1 == x2)
cout<<x1+2<<' '<<y1<<'\n';
else
cout<<x1<<' '<<y1+2<<'\n';
return 0;
}
D
用一个map记录每个位置马可攻击的数量
#include <iostream>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
int main() {
int n,x,y;
cin>>n;
const int dir[8][2] = {2,1,1,2,-1,2,-2,1,-2,-1,-1,-2,1,-2,2,-1};
set<pair<int, int>> st;
while (n--)
cin>>x>>y, st.insert({x,y});
map<pair<int, int>, int> mp;
for (auto &[x, y]: st)
for (int i=0; i<8; i++)
if (x+dir[i][0] > 0 && y+dir[i][1] > 0 && st.find({x+dir[i][0],y+dir[i][1]}) == st.end())
mp[{x+dir[i][0],y+dir[i][1]}]++;
auto it = max_element(mp.begin(), mp.end(), [](const pair<pair<int, int>, int> &p1, const pair<pair<int, int>, int> &p2) {
return p1.second < p2.second;
});
cout<<it->first.first<<' '<<it->first.second<<'\n';
return 0;
}
E
遍历x或y方向上距离为1的点集 求出相邻点集交集的元素个数t 则这两个点集可构成C(t,2)=t*(t-1)个
注意根据容斥原理 要减掉边长为1的正方形的情况
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <algorithm>
using namespace std;
long long get_ans(vector<pair<int, unordered_set<int>>> &v) {
long long cnt = 0;
for (int i=1; i<v.size(); i++) {
if (v[i].first - v[i-1].first != 1)
continue;
int t = 0;
for (auto &x: v[i].second)
if (v[i-1].second.find(x) != v[i-1].second.end())
t++;
cnt += (long long)t*(t-1)/2;
}
return cnt;
}
long long get_ans_1(vector<pair<int, unordered_set<int>>> &v) {
long long cnt = 0;
for (int i=1; i<v.size(); i++) {
if (v[i].first - v[i-1].first != 1)
continue;
vector<int> v1;
for (auto &x: v[i].second)
if (v[i-1].second.find(x) != v[i-1].second.end())
v1.push_back(x);
sort(v1.begin(), v1.end());
for (int j=1; j<v1.size(); j++)
if (v1[j] - v1[j-1] == 1)
cnt++;
}
return cnt;
}
int main() {
int n,x,y;
cin>>n;
unordered_map<int, unordered_set<int>> mpx, mpy;
while (n--)
cin>>x>>y, mpx[x].insert(y), mpy[y].insert(x);
vector<pair<int, unordered_set<int>>> vx(mpx.begin(), mpx.end()), vy(mpy.begin(), mpy.end());
sort(vx.begin(), vx.end(), [](pair<int, unordered_set<int>> &p1, pair<int, unordered_set<int>> &p2) {
return p1.first < p2.first;
});
sort(vy.begin(), vy.end(), [](pair<int, unordered_set<int>> &p1, pair<int, unordered_set<int>> &p2) {
return p1.first < p2.first;
});
cout<<get_ans(vx)+get_ans(vy)-get_ans_1(vx)<<'\n';
return 0;
}