题解 CF1299B 【Aerodynamic】
ShineEternal
2020-02-10 21:37:47
[更好的阅读效果](https://blog.csdn.net/kkkksc03/article/details/104255317)
## description:
- 给定一个由 $n$ 个点组成的**严格**(不存在三点共线)凸多边形。
- 你要将这个图形平移 $n$ 次,每次将一个顶点与原点 $(0,0)$ 重合。
- 请判断这 $n$ 个平移后的多边形除了与原点重合的点之外的点组成的多边形是否与原图形[相似](https://tinyurl.com/vp5m7vl)。
- 在读入中,保证输入的点按逆时针顺序排列,形成严格凸多边形。
- $3\le n\le 10^5$
- translate by @[ShineEternal](https://www.luogu.com.cn/user/45475)。
## solution:
这道题我们可以发现只需判断图形是否为中心对称即可。
因为平移后拼成的大图形本质上是由小的原图形支撑起来的。
要让他们相似,就要使得本来不同的顶点相似的对应。
---
还有题目良心的给出了排好的序,直接每一组对应点的中点和第一组点的比较即可。
## code:
```cpp
#include<cstdio>
using namespace std;
double x[100005],y[100005];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&x[i],&y[i]);
}
if(n%2==1)
{
printf("NO\n");
return 0;
}
double p1=(x[1]+x[n/2+1])/2,p2=(y[1]+y[n/2+1])/2;
for(int i=2;i<=n/2;i++)
{
double p3=(x[i]+x[n/2+i])/2;
double p4=(y[i]+y[n/2+i])/2;
if(p3!=p1||p4!=p2)
{
printf("NO\n");
return 0;
}
}
printf("YES\n");
return 0;
}
```