[codeforces 1300D] Aerodynamic 几何+中心对称+非中心对称+(map,pair)查重+除法避免不整除的技巧
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1300/problem/D
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
D - Aerodynamic | GNU C++11 | Accepted | 124 ms | 5500 KB |
//几何+中心对称+非中心对称+(map,pair)查重+除法避免不整除的技巧
//借助图形,例子才将题目看懂,第一次接触用程序解决几何问题
//画图研究找规律,这个能力对有的人要求高啊。
//该题的核心是:T一定是中心对称图形.若P是中心对称图形,相似;若不是,则不相似.
//若还不明白,请看https://www.bilibili.com/video/av87962198?p=4视频讲解。
//map查重真方便。
//几何还是要经过一定的训练。
#include <cstdio>
#include <map>
#define maxn 100010
#define LL long long
using namespace std;
LL x[maxn],y[maxn],midx,midy;
map< pair<int,int>,int> mp;
int main(){//以下程序一直在对P操作,而没有涉及T
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%lld%lld",&x[i],&y[i]);
x[i]*=n,y[i]*=n,midx+=x[i],midy+=y[i];//之后midx,midy涉及除n,故将x,y整体乘n
mp[pair<int,int>(x[i],y[i])]=1;
}
midx/=n,midy/=n;//此时的midx,midy是对称中心坐标(管他有没有,找了再说)
for(i=1;i<=n;i++)//查重
if(mp[pair<int,int>(2*midx-x[i],2*midy-y[i])]==0)break;//(x1+x2)/2=midx,x2=2*midx-x1;找不到x2,不是中心对称
if(i==n+1)printf("YES\n");
else printf("NO\n");
return 0;
}