Description
给定一个由 $ n $ 个点组成的严格(不存在三点共线)凸多边形。
你要将这个图形平移 $ n $ 次,每次将一个顶点与原点 $ (0,0) $ 重合。
请判断这 $ n $ 个平移后的多边形除了与原点重合的点之外的点组成的多边形是否与原图形相似。
在读入中,保证输入的点按逆时针顺序排列,形成严格凸多边形。
$ 3le nle 10^5 $
Solution
最终的这个图形就是 (S) 与 (-S) 的闵可夫斯基和
结论:新图形与原图形相似,当且仅当原图形是中心对称图形
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
int n;
double x[N],y[N];
signed main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) {
cin>>x[i]>>y[i];
}
if(n&1) {
cout<<"no";
}
else {
for(int i=1;i<=n/2;i++) x[i]+=x[i+n/2], y[i]+=y[i+n/2];
int flag=1;
for(int i=2;i<=n/2;i++) {
if(fabs(x[i]-x[1])>1e-6 || fabs(y[i]-y[1])>1e-6) flag=0;
}
if(flag) cout<<"yes";
else cout<<"no";
}
}