AtCodet Beginner Contest 259 参加記録
コンテスト中AC:A〜D
B - Counterclockwise Rotation
ベクトルの反時計回りの回転行列は以下の通りです。
よって、求めたい座標をとすれば、
となります。
但し、C++では角度はラジアンにしないといけないので、として、の代わりにを渡します。
実装は、ようやくベクトルの回転をライブラリ化したので、それを載せておきます。
Submission #33246511 - AtCoder Beginner Contest 259
D - Circumferences
円及びが交点を持つなら、点は間を移動できます。
このように点が行き来できるような円の関係はUnion-Findで管理できます。
Union-Findにおいて、円が同グループとなる条件は、円が交点を持つことです。
この条件ですが、Web検索して以下を見つけました。
というわけで、円の全組を全探索し、以下の条件を満たし、交点を持たない場合以外にはグループ化します。
とした時、
誤差が怖いので、全て2乗で考えました。
半径の大小関係が規定されていたので、念のための場合に判定することにしました(おそらく2乗するので必要ないです)。
グループ化した後は、点を通る円と、点を通る円がグループであるかを全探索し、1つでも同グループがあればYes、1つもなければNoとなります。
この全探索の前準備として、点を通る円を配列に記録します。
点を通る円も同様に配列に記録します。
点が円上にあるかは、に代入して、を満たせば良いです。