人生苦短,我写暴力
开两个结构体数组,
一个按照先x升序后y降序排
一个按照先x降序后y降序排
然后从0扫到(n/2+1)就好
判x之和是否相等和y坐标是否相等即可
因为很简单就直接贴代码啦
#include<cstdio>
#include<algorithm>
class Solver{//解题的类
public:
struct Point{//点的结构体
int x,y;
Point(){}//无参构造函数
Point(int x,int y){//构造函数
this -> x = x;
this -> y = y;
}
};
static bool cmp1(Point a,Point b){//x升序后y降序排
return a.x < b.x || (a.x == b.x && a.y > b.y);
}
static bool cmp2(Point a,Point b){//x降序后y降序排
return a.x > b.x || (a.x == b.x && a.y > b.y);
}
void main(){
const int L = 1000 + 6;
Point p1[L],p2[L];
int n;
scanf("%d",&n);
int d1,d2;
for(int i = 0;i < n;i++){
scanf("%d %d",&d1,&d2);
p1[i].x = p2[i].x = d1;//输入
p1[i].y = p2[i].y = d2;
}
std::sort(p1,p1 + n,cmp1);//sort
std::sort(p2,p2 + n,cmp2);
int axis = p1[0].x + p2[0].x;//求对称轴,这样排序后,两个数组第一个就是最左和最右的同y的点
bool running = true;//开始判断
for(int i = 0;i < n / 2 + 1;i++){
if(p1[i].x + p2[i].x != axis || p1[i].y != p2[i].y){//如果不在对称轴上,或者两点y不等
running = false;
break;
}
}
printf("%s\n",running ? "YES" : "NO");//输出
}
};
int main(){
int n;
scanf("%d",&n);//总输入
while(n--){
(new Solver) -> main();
}
return 0;
}