ARC153

3完。解けたのも時間がかかったのも順当に思える。レーティングのグラフも平ら。黄色で平らなのは喜ばしいけど、本当にギリギリ維持しているという感じなのでしんどさはある。

A - AABCDDEFE

まあいつものだろう。ちょっと変わってるのは、7桁目と9桁目がリンクしてて8桁目を飛び越えてるところ。ただこれも、7桁目に9桁目を足したところで8桁目より10倍以上大きいことには変わりない。最上位が1から始まるので、Nには100000-1を足しておく。あとはその6桁のNをstringに変換して上から割り当てるだけ。サンプル2で、「ああ、998244353型の数ってことね」と。

B - Grid Rotations

こんなん解けるわけないと思いCを読む。Cも難しいので帰ってくる。ここでトイレへ。500*500固定なら簡単だったりしないかなと考えていると、そもそも縦横を独立に考えられそうなことに気づく。つまりH=1のケース(制約に反してるけど)が解ければよい。トイレから戻る。

なんかデータ構造で殴れそうな気もするが、全然わからない(殴れるらしい)。しばらくして、rotate+reverseであると気づく。おいおい序盤でそれ(rotateはreverse3回でできるということ)はちょっと思ったけど簡単にできるreverseのほうだからって捨ててたよ(たくさんアイデアを出して秒で捨てるという操作の中なので仕方ない面はある)。しかも手で123456789って書いて何回か操作する実験をしていたのに、1回目の後半reverse忘れてるなとミスに気づいて放置してた。これは実験だけで気づいていた可能性がある。

まあ頑張って実装。偶数回目はreverseされた状態なのでrotate方向を逆にする。0,1,2,...を入れたvectorを実際にrotateして、Qが奇数なら最後にreverseする。i番目の場所に元々何番目だったものが来ているかがわかるのでこのvectorを使ってa[x[i]][y[j]]のように出力できる(逆引きが必要かと思ってしまったのでかなり混乱した)。

コンテスト中なので、手で実験したときどうミスっていたか確認するとか正しく実験してみて挙動を見るとかが、時間がなくてできないのがつまらない(そういう面があるというだけでコンテスト中ならではの楽しさのほうが遥かに大きい(楽しいか?笑))。

C - ± Increasing Sequence

いくつかの例を考える。10^12という制約が難しさに寄与しているのかどうかも気になるが、とりあえずその制約なしで考える(強い心が必要)。最初はAのランレングスをとって長さが2の(符号が1回だけ切り替わる)ときだけNoかなと思っていたけど、よく考えると違う。そもそも、-1と1の個数に差があれば全体に定数を足すことで調節できる(細かいところは端を動かせばいい)。個数が同じときを考えると、例えば -1 1 -1 1 と交互にある場合はNoだ(隣り合う-1と1をペアにすると常に1の相手のx_iのほうが大きくなる)。左から貪欲にペアを作っていくことを考えていたが、楽な実装として、マイナス方向へずらすものとして1が欲しいとき左からAの和をとっていって和が1になったらそこを含め左を全部ずらすというのを考えた(1単位で調節できる!)。これで実装して例外もなさそうなので提出、WA。

10^12はN^2より大きいので大丈夫。細かいミスもなさそうに見える。けっこう悩んだ。こういうときは落ち着いて自分の解法の証明を追う。時間が迫ってくるので落ち着けないけど。そういうケースはなさそうだと思ったけど右からも探す必要がある?確かに、左から見て総和を減らすための1が欲しいとき、右から見て総和を減らすための-1も探せば、-1と1の個数が違えば必ずどちらかは見つかる(Aの両端が同じならそもそも勝ち確)(-1と1の個数が同じときは最初から大丈夫そう(だから間違えたのか?))。証明できた気になったあと、シンプルなほうへ逃げてしまったけど、詰めが甘かった。デバッグ用のif無効化をそのままにしてさらに1WA。脳がかなりギリギリの状態だったのでしょうがない。

(追記)最初にWAになったやつは -1 -1 -1 1 1 で撃墜できた。減らすための1を左から探すと見つからない(累積和が常に負)(-1を右から探せばOK)。x = (0, 1, 2, 3, 4) に対し重み付きの和を正にするには1が少ないとできない気がしていたけど単に後半に固めるだけでよかった(-1 -1 1 -1 みたいな小さい例で余裕がなくて思い込んでしまった(両端を同じ数にする必要もないし、同じ数にしたってできるだろうし、証明ってほんとに強い武器なんだよな))。