ABC313

ABCEの4完。終了後1時間以上かけてDとGを通した。仮にEを通したあとDを無視してGをやっていたらギリギリ間に合わなかったくらい。遅すぎてまともに戦えない。なんてつまらないんだ。Dを考え直してるとき、頭が熱くなって、破壊された。結果に影響はなかったと思うが、情けなくなった。思えばBC辺りも全然証明できてなかった。

A - To Be Saikyo

面倒なだけ。感想書く気も起きん。

N=1のケース普通に見落としてた。手元では誤った答えを返すが、おそらくメモリにたまたま0が入っていてACしたのだろう。どうでもいい。

B - Who is Saikyo?

推移律が成り立つということは、与えられたグラフはトポロジカルソートできて、トポロジカルソートで先頭に来る頂点が1通りならそれを答えよという問題。入次数が0なら最強の可能性あるし、それが唯一なら確定で最強だよね?なんで「?」が付いてんだよ。

C - Approximate Equalization 2

数列の総和をSとする。条件を満たしたとき、数列はS/NがN-S%N個とS/N+1がS%N個で成っている(割り算は切り捨て)。自由に+1か-1できるとして、Aをソートして近いものから割り当てていけば最小操作回数はわかる。+1と-1の個数は同じなのでちゃんと問題文にある操作でもできる。2で割るのを忘れてサンプル合わなかった。

D - Odd or Even

K=1なら簡単。例えばN=7, K=3のとき、123と234の差をとれば1と4の差がわかる。これをぐるっとやると、1がわかっていれば全部わかることになり、Kは奇数だから1を反転させると123も反転し、全部求まる。ここで、ぐるっとして辻褄が合う(これは当然合うんだけど)気持ちがわからず困った。よくわからないけど、正しいことをやれば正しいので、実装して提出、1個だけWA。軽く見直してわからないのでEへ。ちょっと早いけどここで順位表も見た。

gcd(N, K)が1みたいな感じでずっと考えていた。1じゃないことは普通にあって、N=21, K=15とか。差がわかるシーケンスがいくつか(複数)できてしまい、じゃあいくつかに分けてやろうと実装を始めたが、自由度も高くなって求まらない。残り2分とかになってようやく、11100, 11010, 11001, 10110, 01110のように隣同士で差がわかるようにして最初の解法が使える形があると気づいた。しかしこれの実装がめちゃくちゃ複雑でめちゃくちゃ時間かかる。解説の、K+1個をまず求めるというの天才だなあ。N=6, K=3というダメなケースを思いつかないのも酷い。

E - Duplicate

サンプルを追って、次にもう実験をした。2以上が2個連続していると減らない(2以上が2個連続している状態が維持される)。末尾の1が1個ずつ減っていく。ランレングス圧縮して、1と1以外が交互にある状態にする(2以上の異なる数が1個ずつ連続している(34みたいに)のを最初見落としていた)。それを逆から見ていく。末尾が1であればその個数だけ操作する。1でないものが現れたら、その数自身を1回の操作で消してから、それまでの操作回数分だけ1が増えているのでそれを足す。次に元からあった1を消すという感じで。最後は1文字だけ残すので場合分け。

G - Redistribution of Piles

終了後に問題文を読んだ。かなり簡単そうに見える。aはソートしても答えは変わらないのでソートする。整数列全体に同じ整数を足して得られる整数列を、同じ形と呼ぶことにする。2個目の操作で形は変わらない。aに0が含まれている場合を考えると、1個目の操作で毎回形が変わる。2個目の操作をはさんだところで1個目の操作で打ち消すだけ。形毎に、一番袋に多く入っている状態から2個目の操作を何回できるかの和がわかればよさそう。これはatcoder::floor_sumでできるやつだ。ソートして前の数との差をDとし、1個目の操作を1回からD回までやったときのそれぞれの形の通り数の和をfloor_sumで求める。最初サンプルが合わなかったが、落ち着いてa_1を別処理すれば大丈夫だった。