ARC119

昨日の反省を生かし、ぷよぷよ観戦を10分前に切り上げ、それより前の生活も体力に気をつけた。力は出せたと思う。

A - 119 × 2^23 + 1

「それに関連して」ってあるけどあんまり関係ないだろ(FFTに使えるかどうかの話に見えてしまった)。答えの最大値がそんなに大きくならないという話かと思って考えるが、2進法で1の桁が多い数を考えるとそうでもなさそう(そもそもサンプルにそういうのある)。シフトっぽいのでbを固定してみる。シフトしてなおaとcが重なっているケースが厄介そうだが、重なりはaに押し付ければ合計を減らせそう。あまりよくわかってなかったけど重ならないとしてよさそうなので、それなら一意だから計算できる。AC。まあ、cが2^b減るとaが1増えるので、損しない(こういうのをその場ですっきりわかりたいが)。

B - Electric Board

まず操作の定義を認識、次に解釈して考えやすくする。挿入ソートなのかバブルソートなのか微妙なところだが、しばらくして 0 を泡に見立ててバブルソートみたいになると気づいた。操作回数はバブルソートと異なり一発で行けそう。0同士は入れ替わらないので、対応する0は決まっていて対応するもの同士が同じ位置にあれば操作不要、違う位置にあれば1回の操作で行けそう。同じ位置にあるペアで区切って端からどっちかに合わせていく感じ。操作は可逆なので大丈夫そう。あとはしゃくとりみたいにして対応する位置を求めてそれが異なるものを数える。

C - ARC Wrecker 2

高さの和が偶数ならできそうだけどそうでもないんだね。偶数番のビルと奇数番のビルに1ずつ足す(または引く)操作だから、それぞれの総和が一致しないといけない。偶数番から始まって偶数個ずつなら累積和で行けるし他も同様に行けそうだが。幅が奇数の区間を考えて気づいたがそもそも場合分けせず累積和で全部行ける。奇数番だけ符号反転して累積和をとればいい。和が0なら端から合わせていけばいい。mapで個数を数えて、k*(k-1)/2を足していく。区間の幅が0のケースは除外できているし、幅が1のケースはそもそも和が0にならない。つまりこれだけで解けている(順位表でペナが少ないのは確認した)。

D - Grid Repainting 3

DEを交互に考えて、少ししてこちらに注力する方針に行き、そのまま最後までDをやった。解けなかった。まずUnionFindで連結成分を調べる。logを付けたり定数倍が重かったりすると死にそうなので、時間の節約のため(計算量気にしながら書くのはなにかと時間がかかる)ACLのdsu::groupsを利用する。行にx個、列にy個使ったとして重なってロスになる個数はx*yなのでそれが小さくなるようにどっちかに寄せる。それを決めたら手順の構成。色々な例を考えて、連結成分内の 行の個数+列の個数-1 が達成できそう。そのように書き進めるが、手順の構成がかなり厄介そうで、結局そこで時間を使い果たしてしまった。連結成分内に行が何種類あるかのカウントに、この前作ったフラグのstructを使った。フラグをK個立てたらO(K)でクリアできるやつ。含め必要になることは稀だと思うが使いたいときに使えると安心なやつだ。

E - Pancakes

あまり考えてない。これBとかに出したら絶対簡単だよ思うじゃん。でもEだから難しいんだろうと思ってあまりやらなかった。関係するのは高々4要素なので大小関係を全通り考えて絶対値外して行けそうだと思ったけど大小関係の条件を満たした中の最大を求めないといけないのできつそう。