【題解】UVa 1595 【Symmetry】

人生苦短,我写暴力

开两个结构体数组,
一个按照先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;
}