ABC110

うーっし。ABCでいい順位を取ると気持ちがいい。

A - Maximize the Formula

やたら難しい。サンプルも見ると、2桁+1桁にするみたい。たしかに、+を間に入れる必要があるので2桁の数しか作れない。となるとソートして大きい順に98+7とかすることになる。最初、12+3のようにしててサンプルが通らなかった。

B - 1 Dimensional World's Tale

まあこれはやるだけだが、X<Z<=Yの条件がいやらしい。配列上に都市を置いていく方針も考えたが、最大値最小値でいい。そして、xの最大値(yの最小値)を求めるときに、X(Y)を初期値にすればいいと気づいた。不等号の等号があったりなかったりでややこしいが、隣り合ってるのはOKということ。
ここまでサクサク解いてきたつもりが意外と時間を食っている。やはり難易度が高い。

C - String Transformation

一応、Sに含まれない英小文字を選んでもいいことを確認する(サンプル1でやってた)。状況はわかった。同じ文字は同じ文字に対応してるってこと。英小文字が26種類と少ないので不安もあったがまあ対応してればいいから問題ないか。よって、各文字列を先頭から見ていって、最初に現れた文字を全部0に、次に現れた文字を全部1に置換とやっていって、SとTが一致するかを見ればよい。O(N)でやるには文字の変換テーブルを持てばいいのかな。めんどくさそうだと思ってたところ、SからTへの変換テーブルを作ろうとして矛盾が起きるか見るだけでいいじゃんと気づく。サンプルが合わないが、テーブルが26しか確保してないのに'a'を引いてなかったことに気づく。それでも合わない。Sの同じ文字が同じ文字に行く、だけじゃダメじゃん。変換された先の文字たちに重複があってもいけないんだ。大きな見落としがあったので、実装しても不安だが、提出してAC。きれいな問題なので、きれいに書きたかった。

D - Factorization

aが昇順みたいな条件が付いてるとまた別の問題だが、これは全部数えるので、同じ数が多く含まれているほど少なくカウントされる。さてどう数えるか。基本的な方針としては、Mを素因数分解して、各素因数が何個含まれてるかで数列の要素同士を区別する。あ、簡単じゃん、独立に動かせるから各素数についてコンビネーションを掛けていけばいい。ライブラリで瞬殺。しかしサンプルが合わない。ん、p^cのcよりNが小さかったら?ていうか最大で1個しか含まれない前提にしてるじゃん、酷い。これは、仕切りを入れるやつだ。c個のpにN-1個の仕切りを入れてN個に分け、そのc+N-1個の中からN-1個を選ぶコンビネーション。
普段のABCのDを文系とすると今回のDは理系なイメージだった。わりとスピードが出せて順位もかなりよかった。記憶より順位が1つ下がってるけど、これはB問題リジャッジの影響っぽい。X<Yを満たさないテストケースがあったらしく、自分のやり方だと影響ないけど、Zを全通り試すみたいな方針だと確かにWAりそう。