AGC022

A - Diverse Word

asdの次はaseみたいなイメージでやってた(実際はasdb)。26文字未満のとき、文字数が増えるときと変わらないときで場合分けしてた(実際は常に増える)。26文字のときも、末尾を削除せずswapだけで行けそうなイメージだった。その辺はサンプルで引っかかってくれたので一発ACだったが、24分もかかっていたのはびっくり。
まあ解き始めのときも「辞書順について何もわかってない」と思い焦っていたので順当ではあるけど。理解というより慣れを少しだけ得た。最近早解きできないね。それでレーティングを維持しているから、いい傾向とも言えるけど。つうか先週に続いて、どういう気持ちで臨むもんなのか忘れたままなんよ。おおむね落ちついていた。ギアをトップに入れることがなかった。だからこそ解法が降ってきたのかもしれないが、それでいいとも思えない。

B - GCD Sequence

下準備として、30000以下の素数を列挙して97以下の素因数しか持たない整数を数えたりしてた。問題文がやや読みづらいが、要するに全ての条件を満たすものを構成すればいい。最大公約数が1でないという条件を満たすには、全体の和が公倍数みたいになってれば小さい素因数が公約数として残るのでよさそう。例として出した97は大きいけど、もっと小さく3以下の素因数しか持たないとしてもギリギリ行けそうくらい。
制約がそうしろと言ってる気もしたが、全体を6の倍数にしたいのでギリギリだと調整できない(あるいは「自分には」できない)と判断して2,3,5を採用した。これなら余裕があるので調整できると思える。いろいろ悩んでみたが、とりあえず30で割ったあまりを2個の整数の和で全30通り出せることを全探索で確認する行動力。時間はかかったがこれで解けることがわかった。前問に続いてコーナーケースをサンプル出力に委譲する(むふふ)。

C - Remainder Game

Bは解けると思ってやっていたが、このCは解ける気がしない。それでも最後のころになると「もう少し時間があれば」という感情が出てくるくらいまでは行った。そもそもBまでで77分使ってるのでAPCみたいに時間が使えるわけではない。
ある要素に対する操作を50*50通り表示させてみた。心に余裕がある。行動はいい行動だがもっと焦ったほうがいいのでは。まず各要素の最小操作回数をDPで求める。求めた。それをORとってみよう。これで答えっぽいものは既に出た。ただし最適解までは遠い。当然ながら他の要素の操作と共有することでやり方は変わってくる。
ORの発想が出た時点でビットっぽい雰囲気になってるので、貪欲にビットを削ってみる。提出してみるがまあWA。けっこうWAが多い。ビットを削ったら最初からやり直すようにしてビットを見る順番も逆にしてみる(上位ビットから調整したくなる雰囲気だ)。WAは減ったがやはり駄目。もう3分しかないので何もできなかった。ここまで来るのが本当に大変で、でも実はそうじゃなくてここのビットの削り方が本題だったのだと気づいたときには終わっていた。
解説とかを読んで、翌日再挑戦。ついにusing ll = long long;を使ってみた(GCCではint64_tと1LLの型が異なるため)。最小コストを求めるDPだと思っていたが、そもそも有限コストで行けるかという話だった。どういう問題かを知るまでの道程が長すぎて、その辺の切り替えはまず不可能になっている。二分探索的に(そこでしか二分できないんだけど)上位から1ビットずつ決めていくだけだった。確かに、解けない問題ではないんだね。一瞬フローも考えたけど、それでできるかどうかの判断が全くできないのでダメ。