ABC161

E以外の5完。面白かった。Eが面白くてつい考えこんでしまったが、瞬殺できないならFと交互にやったほうが考えを寝かせる時間を稼げていいね。

A - ABC Swap

実装重くて1分切れなかった(1分切りはいつも目標にしている)。まあ他に書きようないししゃーない。あー変数名を手動で入れ替えてc,a,bの順に出力する手もあったか。さすがに怖くてできなさそう。

B - Popular Vote

降順ソートして最初のM個を整数演算だけで判定する。あーM番目だけチェックすればよかったかあ。

C - Replacing Integer

xがでかいならただの引き算なので剰余を見ればいい。xがK未満になったら2つの値で振動するだけだろうから、その小さいほう。解法はすぐ見えるけど、なんかすっきり証明できなくて落ち込む。

D - Lunlun Number

瞬殺できなさそうな見た目をしている。まあKが小さいので解けそう。例えば、「13で始まる4桁のルンルン数の個数」みたいのはみんなDPで求まりそう。しかしさすがにやりたくない。じゃあ小さい順にK個列挙できたり?できそう。小さい順なので桁数を固定しないと難しそう。桁数を固定すればDFSの探索順がそのまま小さい順になってそう。ということで1桁から順にやっていけばいい。DFSの葉の処理がなぜかきれいに書けなくて汚いまま無理やり書いた。

E - Yutori

あまりAtCoderで見ないタイプの問題で面白そう。ある日から始めてK日働けるかの判定は、貪欲に条件を満たす近い日で働いていけばいい。そこで、各日からそれをやって重なった場所を見るというのを思いつき実装してみる。途中で今までのどれかと同じ日に到達したらあとはやらなくていいので全体でO(N)でできそうということで嬉しくなったわけだ。が、貪欲の経路と異なる経路もありえる。貪欲がみんなある日に働いてるからって、その日に働く必要があるとは限らない!

別のアプローチを考える。前後から貪欲に取ると、l回目に働く日がどんな区間にあるかがわかる。その区間を使って答えがわからないか。実装もして、しばらく考えるが、どうもわからないっぽい。ということで、21:47くらいにFへ。今回は楽しむこと優先でと考えていたが、やはりしばらく考えてダメなら他の問題に行ったほうが悩む時間を節約できる。いやほんと時間に余裕があるときに出会いたい、ゆっくり考えたい問題だった。

Fを解いて戻ってきた。それぞれの日について、その日に働く必要があるか判定できないか。左右を見て、すぐ左の'o'から左に何回働けるか、右も同様にして、足してKになればOKみたいに。これはできそうでは。時間が10分くらいしかないので実装できないと思ったが、なんとか30秒前に書き上げるところまで行けた。しかしサンプル通らず。今になって考えると、その左右の距離がちゃんとC+1以上ないとダメじゃん。

F - Division or Substraction

要するに、K進法で表したとき下位から見て最初に現れる非0が1ってことだ。2は危ないぞ(コーナーケースだぞ)と強く意識しておく。自明そうなケース(1が現れるのが最下位やその次N=K)を除くと、K^2<=Nのケースだけ見ればいい。それなら全探索できる。が、サンプルは合わない。最下位はともかくその次の(12310みたいの)はけっこう多いな!?N-1の約数ならいいのかあ(確かにあまりが1になる)。それを加えるのだが、被らないように。K^2<=Nの解は全て求めたので、K^2>Nのものを求めればいい。NではなくN-1の約数でそれをやるのにはやや混乱した。N=2も含め、カウントに重複や抜けがないように書く。冷静になるまで時間をかけて書いて、見直して提出、WA。けっこうすぐWAが出てた。(N-1)/2を2乗するとオーバーフローするじゃん。そこを直すとAC。いやあ簡単だと思ったら重かった。