题面
思路
注意到题目要求为找一条竖线,一开始以为是随便找一条对称轴然后无从下手。
首先我们仅从x坐标入手,看看能不能找到众多x坐标的对称轴,如果找不到,显然输出NO;如果找到,再遍历所有点,看看这些点对称过去得到的点是否也存在于图中,如果都满足,输出YES,反之输出NO。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<vector>
using namespace std;
struct point{
int x,y;
point(int a=0,int b=0){
this->x=a;this->y=b;
}
};
bool operator<(point a,point b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
set<point> p_set;
vector<int> x_vec;
void clear(){
p_set.clear();
x_vec.clear();
}
int main(){
int t;
cin>>t;
while(t--){
clear();
int n,x,y;
cin>>n;
for(int i=0;i<n;i++){
cin>>x>>y;
point p(x,y);
x_vec.push_back(x);
p_set.insert(p);
}
sort(x_vec.begin(),x_vec.end());
int x_n=x_vec.size(),m;
m=x_vec[0]+x_vec[x_n-1];
for(int i=0,j=x_n-1;i<=j;i++,j--){
if(m!=x_vec[i]+x_vec[j]){
cout<<"NO\n";
goto end;
}
}
for(set<point>::iterator it=p_set.begin();it!=p_set.end();it++){
point p0(m-it->x,it->y);
if(p_set.count(p0)==0){
cout<<"NO\n";
goto end;
}
}
cout<<"YES"<<endl;
end:;
}
return 0;
}
值得一提的是,构建自定义类型的set需要重载运算符<,使自定义类型可以比较。并且重载小于号时切记不能模糊定义,因为这影响到set中许多函数的使用。我一开始为了方便只比较了x,最后在使用时产生较大的问题,究其原因,大概是程序把所有x相同的point都认为是同一个point了。