Codeforces1300D. Aerodynamic

本题题目有点绕,结合图例大概可知,P(x,y)是以点给出的一个凸包,T是一个点集合,也构成一个凸包,构成的方法就是将原点(0,0)在P(x,y)的边上跑,移动坐标轴,其构成的最远点是个凸包,我们可以画出几个例子,可以看出,T一定是中心对称图形,而P与T相似,P也一定要是中心对称图形,且如果P是奇数条边就一定不满足条件,直接对x,y坐标判断是否是中心对称图形即可,相邻两个点坐标之差与对称的点的差相同

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long LL;
 
 
void run_case() {
    int n;
    cin >> n;
    vector<int> x(n+1), y(n+1);
    for(int i = 1; i <= n; ++i) cin >> x[i] >> y[i];
    if(n & 1) {
        cout << "NO";
        return;
    }
    n >>= 1;
    for(int i = 1; i <= n; ++i)
        if(x[i+1]-x[i] != x[(i+n)]-x[(i+n)%(2*n)+1] || y[i+1]-y[i] != y[(i+n)]-y[(i+n)%(2*n)+1]) {
            cout << "NO";
            return;
        }
    cout << "YES";
    
}
 
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    //int t; cin >> t;
    //while(t--)
    run_case();
    cout.flush();
    return 0;
}
View Code

 

posted @ 2020-02-11 14:54  GRedComeT  阅读(211)  评论(0编辑  收藏  举报