ABC296

6完。Gは仕方ないとはいえ自己肯定感が下がる。Fまではいい動きができていた。

A - Alternately

同じのが隣り合ってないかN-1箇所調べる。

B - Chessboard

これは簡単。実装上は、とりあえず 'a' + j と書いて、そのうちに '8' - i を思いつく。

C - Gap Existence

けっこう難しそう。とりあえずソート。そしたらしゃくとりだ。

D - M<=ab

状況がわかりにくい。Nが大きければ(M以上なら)答えはM。Nは小さいほど不利、Mは大きいほど不利。10^6回ほど調べればいいんだろうなあとは思うが、具体的なものが見えない。とりあえずa,bの小さいほうを固定する(iとする)。M以上の最小のiの倍数がN以下なら条件を満たす。i自体もN以下でなければならないことに注意。答えの候補はすぐ見つかるので、i*iがそれ以上になったらやめればいい。

これでACしたけど、きつかった。サンプルが全然通らなかった(条件が感覚でわかりにくい)。自分の実装だと、Mが大きくて両方N以下のa,b候補が全然見つからないときループはN回まわってしまうが、そういうときはNが小さいから大丈夫。その辺あいまいなまま提出してしまった。

E - Transition Game

要するにグラフ。青木君はどんなに大きな整数を選ぶことも許されている。グラフはループにヒゲが生えたようなやつだが、青木君がNを選べばヒゲの部分の整数で止めることはできない。一方、ループ部分の整数なら、青木君が選んだ数だけそこから(ループ内だけを使って)戻れば高橋君が勝てる。ということで、ループに含まれるやつの個数がわかればいい。自分で実装しようとしたが、思ったより面倒なのでatcoder::scc_graphを使うことにした。長さ1のループで困るけど、これは簡単に検出できるので数えておく。長さ2以上のループは強連結成分になっていて、長さ2以上のループに含まれないものが属する強連結成分のサイズは1なので、2以上のものを足していく。

たまたまACしたけど苦手。普通にやるならそう実装するんだろ。

F - Simultaneous Swap

単に転倒数?あー同じ数が含まれる場合あり。実際にそれでいいか考えていく。当然ソートして一致することが必要条件。転倒数の偶奇が一致することも必要条件。そのとき、端から合わせていけば2個を残して合う。転倒数の偶奇が同じなら最後の2個も合っているはず。なのでOK。同じ数が複数含まれる場合は、その同じ2個を残して合わせれば必ず一致する。これをコードに落とすのが意外と大変だった。必要条件をあとからチェックする実装になった。ソートしちゃったら転倒数の情報消えちゃうからね(コピーすればいいけど嫌だったので)。

G - Polygon and Points

4WA。終了後さらに1WA。はあ。doubleで考えればまあ解けそうではある。整数でやる時間はない。今考えるとそもそも整数でできるのかもわからない。

内部にある点として重心を求めて、そこから見た頂点の偏角を求める。これを二分探索すれば、どの辺を見て内部か外部か判断すればいいかがわかる。辺の重心側にあれば内部。これは辺と垂直なベクトルとの内積を比較すればいい。同じなら境界上。誤差を考えて前後を含め3つの辺でチェックしたが、辺上にないが辺を含む直線上にはあるというケースを見落としていて11個のWAが出ていた。そこを修正して3個に減ったが、どういう誤差で死んでいるのか、あるいはそもそも何かが間違っているのか、わからず。できることはやったし、内容的にも悪くないはずだが、無力感だけが残る。