ganmo::cout

競技プログラミング始めました

AtCoder Beginner Contest 126

またUnrated回でした
参加者が5000人を超えた*1こともあるしだいぶきつそうですね

A - Changing a Character (100点)

A - Changing a Character
大抵の環境ではアルファベットの文字コードが連続しているので、'A' - 'a' を引けば大文字になってAC。O(1)

拙解 (C++14): Submission #5448637 - AtCoder Beginner Contest 126

B - YYMM or MMYY (200点)

B - YYMM or MMYY
2桁に分けて、0であるか12より大きかったらYYしかありえない。よって4通りありえて、場合分けしてAC。O(1)

拙解 (C++14): Submission #5452038 - AtCoder Beginner Contest 126

C - Dice and Coin (300点)

C - Dice and Coin
これは要するに「初期得点が1~6で同確率・無作為に決まり、K以上になるまでコイントスで勝ち続ける確率」なので、すべての初期得点に対して倍プッシュ何回でKに届くか数えてその都度初期得点ごとの確率を半分にして全部足せばAC。O(N \log {N})

拙解 (C++14): Submission #5457899 - AtCoder Beginner Contest 126

D - Even Relation (400点)

D - Even Relation
無向グラフで巡回がないので、d(u,v)d(v,u)は等しい。加えて、木なので、ある頂点rを根とすればd(u,v)=d(r,u)+d(r,v)-2d(r,{\rm 最近共通祖先} (u,v))というふうに定まって、偶奇は各ノードで独立に定まるとわかる。したがって、どれかのノード(0とか)をどっちかの色で塗ってそこからBFSで偶奇が入れ替わるたびに塗る色を変えてAC。O(N)

拙解 (C++14): Submission #5464301 - AtCoder Beginner Contest 126

E - 1 or 2 (500点)

E - 1 or 2
無矛盾が保証されている!したがって、カードの中身は1か2かしかなく偶奇だけ気にすればよく、A_{X_i}がわかればA_{Y_i}がわかる!もちろんその逆も然り。したがって、(X_i, Y_i)を辺としたグラフを張って、Union-FindやBFSなどで連結成分の数を求めればそれがそのまま答えとなってAC。BFSならO(M)、Union-FindならO(Mα(M))α(x)アッカーマン関数逆関数で、現実的な範囲内ではほとんど定数)。
無矛盾が保証されているので、Z_iは関係ない。ARC級の500点だったら無矛盾が保証されてなくて見る必要ありそう。

拙解 (C++14): Submission #5470040 - AtCoder Beginner Contest 126

F - XOR Matching (600点)

F - XOR Matching
まずK\ge 2^Mの場合はどうやってもXORでKを作れないので不可能。そうでない場合、M, Kが小さい場合でいろいろ実験すると、(K以外昇順),K,(K以外降順),Kという数列を作れば条件を満たしそうとわかる。K以外については、挟まってる中身にK以外が2項あるため、XORするとすべて0になって*2、総XORがKになる。Kについては、中身はK以外の負でない整数すべてがあるので、この総XORはK*3。サンプルにあるようにM=1の場合がコーナーケースとなって、これを考慮してAC。O(2^M)

拙解 (C++14): Submission #5474062 - AtCoder Beginner Contest 126

まとめ

Eで1WAして再提出したあたりからジャッジが詰まって結果が出たのは終了後数時間経ってからでした
最終的にEもFもAC通ってて254位パフォ1930(ac-predictor)だったので良かったんですが、さすがにFull-Feedbackコンテストにおいて参加者の間でジャッジの応答に差が出たのはまずかったらしくUnratedになってしまいました
詫びABCが5/25(土)と5/26(日)の二日連続で行われるらしいので期待してます

*1:参考:

*2:任意の負でない整数XについてX\oplus X=0が成り立つ

*3:2^Mが4の倍数なら。ABC121-D参照