ARC158

3完、ペナ込みで143分。AとCを通すまではよかった(面白かった)けど、そこから1時間以上虚無を過ごした。難しいことは何もわからない、つまらない人生。

A - +3 +5 +7

-2 0 +2 としても同じ(これで状況が本当によくなっているかしばらくわからなかった)。操作しても平均は変わらない。可能な場合、平均は整数になる。平均を引いて2の倍数でない場合は不可能。-1 0 +1 と同じになったので、絶対値の和の1/2倍が答え。簡単そうに見えたし実際簡単だったと思うが、ちゃんと詰めるのに時間がかかってしまった。

B - Sum-Product Ratio

解きたくない見た目をしている。少し考えてCに行った。

絶対にやりたくない見た目をしている。とりあえず全部正のときを考えてみるが、まあ一番大きい3つを取るのと小さい3つを取るのだよねえ。どう証明したものかわからんけどさすがにこれは正しいだろう。問題は、正の数と負の数を両方取る場合。これも端だけ取るか。あまりにも難しく解ける見た目をしていないのでとりあえず提出してみる。WA。そういえばどっちの端かで4通りあるな。またWA。これで通らないとなると、実装が楽な解法を他に思いつかない。

分子を0に近づける必要がないかと最初から心配はしていたが、考えるとこれは不要っぽいんだよね。-1000000 1 2 3 4 5 みたいなときは負の数を作れなくて、ここまで極端じゃないときは負の数を作れるかの勝負になってどっちにしろ結局は絶対値が大きいものを作ることになる。負の整数が2個以上あればたぶん負の数を作れる(絶対値が大きければ2個使って分子を負にできるし、小さければ1個使って分子を正にできる)。

何一つ証明してないので本当につまらない。あとは、絶対値を大きくしたい(絶対値の小さい整数を選びたい)けど分子が0に近くなってしまうという状況で端を選ぶとは限らないのかもしれない。あまり離れたところへは行かないだろうなあと思って、200^3や2000^2の探索をする。WAの個数は減っているが、まだダメ。これでダメならまともな解法が存在すると思えない。同じ数がたくさんあるときのためにuniqueかけたりしたけどさすがに苦し紛れ。最後、O(1)の部分をN回できると気づいて、必ず選ぶ整数をN通り固定して他の2個を端から選んでみたらAC。最初の提出から1時間20分経っているし、考察はほぼ進んでいない。

C - All Pair Digit Sums

繰り上がり1回毎に桁和は9小さくなる。繰り上がり回数がわかればよい(桁和の和の2*N倍から繰り上がり回数の9倍を引く)。しかし、繰り上がりは連鎖するので困る。CPUの加算器だって影響範囲が広いから大変なんだよ。トイレで考えていて、A_iを固定するだけでなくA_iのk桁目というところまで固定することを思いついた。相手のN個のうち繰り上がりが起こるのは何個か。すると、その桁以下からなる数同士を足して桁数が増えるかで判定できそうだと気づいた。は?繰り上がりって桁毎にやることしか考えたことなかったけど、こんな基本的なことを俺は知らなかったのかと思ったし、それを出題してくるARCすごすぎると思った。高々15桁なので、15通り試す。その桁以下だけ取り出してソートして二分探索。なんでTL4秒かと思ってたけどlogが2つ付くからか。

解説見て。基数ソートなるほどなあ(すご)。しゃくとり気づかなかったー!