The figure shown on the left is left-right symmetric as it is possible to fold the sheet of paper along a
vertical line, drawn as a dashed line, and to cut the figure into two identical halves. The figure on the
right is not left-right symmetric as it is impossible to find such a vertical line.
Write a program that determines whether a figure, drawn with dots, is left-right symmetric or not.
The dots are all distinct.
Input
The input consists of T test cases. The number of test cases T is given in the first line of the input file.
The first line of each test case contains an integer N, where N (1 ≤ N ≤ 1, 000) is the number of dots
in a figure. Each of the following N lines contains the x-coordinate and y-coordinate of a dot. Both
x-coordinates and y-coordinates are integers between −10, 000 and 10, 000, both inclusive.
Output
Print exactly one line for each test case. The line should contain ‘YES’ if the figure is left-right symmetric,
and ‘NO’, otherwise.
Sample Input
3
5
-2 5
0 0
6 5
4 0
2 3
4
2 3
0 4
4 0
0 0
4
5 14
6 10
5 10
6 14
Sample Output
YES
NO
YES
#include<bits/stdc++.h>
using namespace std;
struct Point{
double x,y;
Point(double a,double b){ x=a,y=b;}
bool operator < (const Point & b)const{
if(x!=b.x){
return x<b.x;
}
else return y<b.y;
}
bool operator == (const Point & b)const{
return (x==b.x&&y==b.y);
}
};
typedef pair<double,double> Pair;
set<Point> s;
int main(){
//freopen("datain.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--){
s.clear();
int n;
scanf("%d",&n);
double xSum=0;
for(int i=0;i<n;i++){
double x,y;
scanf("%lf%lf",&x,&y);
Point a (x,y);
s.insert(a);
xSum+=x;
}
double axis_x=xSum/n;
bool good=true;
for(set<Point>::iterator it=s.begin();it!=s.end();++it){
if(it->x==axis_x) continue;
else if(it->x < axis_x){
double right=(axis_x - it->x)+axis_x;
Point b(right,it->y);
if(!s.count(b)) {
good=false;
break;
}
}
else if(it->x > axis_x){
double left=axis_x-(it->x - axis_x);
Point b(left,it->y);
if(!s.count(b)){
good=false;
break;
}
}
}
if(good) puts("YES");
else puts("NO");
}
}