ABC207D

ABC207D

题意

在一个平面直角坐标系上,有两个点的集合 \(S,T\),对于 \(S\), 我们采用\({[a_1,b_1],[a_2,b_2],...,[a_n,b_n]}\) 表示 \(S\) 中每个点的坐标 ,对于 \(T\), 我们采用\([c_1,d_1],[c_2,d_2],...,[c_n,d_n]\) 表示 \(T\) 中每个点的坐标。

现在我们想要知道经过数次如下的操作(操作类型可自由选择,操作次数可为 0 )后,是否可使 \(S, T\) 重合:

  • 任选一个实数 \(p(0<p\leq360)\),并将 \(S\) 中的每个点围绕原点顺时针旋转 \(p\) 度。

  • 选择实数 \(q\)\(r\),将 \(S\) 中的每个点在 \(x\) 方向上移动 \(q\),在 \(y\) 方向上移动 \(r\) 。这里,\(q\)\(r\) 可以是任何实数,无论是正数、负数还是零。

如果可使 \(S, T\) 重合,输出 \(Yes\), 否则,请输出 \(No\)

题解

考虑两个点集可以重合的条件是什么。

当点集大小不大于 \(2\) 时,则点集大小相等并且两点距离相等时点集即可重合。

而当点集大小大于 \(2\) 时,只需要验证每个点到其他点的距离集合是否相等即可判断是否大致重合(翻转的情况是不合题意的)。证明的话,可以将点集建立完全图然后拆成若干个三角形,这些三角形都可以靠等边长来证明全等,也就是三个边长唯一确定一个三角形。只要对应三角形全等,那么整个完全图(也就是点集)就是大致重合的。

当然还有更感性也是更简单粗暴的理解:相当于求出点集中两两的相对距离。

这一步实现上可以哈希也可以排序,反正范围很小绝对够用。

考虑怎么判转角度。实际上只需要先确定一个点然后暴力枚举剩下的点的对应关系就行了,也可以选择极角排序后旋转序列。

这两步都满足的话那么两个点集就是符合题意的了。

posted @ 2022-11-15 12:11  Rnfmabj  阅读(31)  评论(0编辑  收藏  举报