一、题意
有kase组数据。
每组第一行一个n表示有n个点。
接下来n行输入这些点(x, y)。
要你判断每组点是否左右对称。
二、解析
先用vector存点,然后sort一下找到中心对称轴。
然后用map法来判断是否对称:具体而言,将对称轴左侧的点视为正标记,右侧的点视为负抵消,维护这样一个flag在map中,最后看是否所有点能恰好完全抵消,是的话说明对称,否则不对称。
三、代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#define mp make_pair
using namespace std;
int kase, n;
vector<pair<int, int> > node;
map<pair<int, int>, int> flag;
int main() {
cin >> kase;
while(kase --) {
node.clear(), flag.clear();
cin >> n;
while(n --) {
int x, y;
cin >> x >> y;
node.push_back(mp(x, y));
}
sort(node.begin(), node.end());
int d_mid;
if(node.size() % 2) d_mid = node[node.size() / 2].first * 2;
else d_mid = (node[node.size() / 2 - 1].first + node[node.size() / 2].first);
for(auto p : node) {
if(p.first * 2 < d_mid) flag[p] ++;
else if(p.first * 2 > d_mid) {
flag[mp(d_mid - p.first, p.second)] --;
}
}
bool ok = 1;
for(auto p : flag) if(p.second != 0) {
ok = 0;
break;
}
cout << (ok ? "YES" : "NO") << endl;
}
}四、归纳
- 多组输入数据时记得clear全局容器
- 还是一样,做题前分析时间复杂度,不超时就大胆写。

京公网安备 11010502036488号