ABC103

A - Task Scheduling Problem

Aが極端に難しい。ただまあ難しい問題だと思って解けば解ける。コストが差の絶対値ということは、Aが小さい順にやっていけばいいのだ。ABCのAでこういうのいつも迷うんだけど、最近はn=3としてソートしてる。差を出力して、WA!?確かに、A問題でそこまで難しくしないだろうという甘えで考察が雑だったかもしれない。しかし、わからない。いざとなれば全探索があるけど。順位表を見てみる。かなりWAが多いが、AC取ってる人もいる。じゃあ俺のミスか。ただ、いつもならサンプルを含んでいたはずのテストケースで全てWA(サンプルは自動で確認しているので合ってるはず)。何かおかしい。Clarが来てない(beta版は開かなくても新たな質問の数が表示される)のを確認してからTwitterを見るが特に何もアナウンスはない(ここでTwitterを見させる普段のAtCoderがどうなのかという気はした)。同じものを提出すればACになるのではという考えも浮かぶが、まあここは後回しで。時間が経てば何かわかるかもしれない。この時点で5分が経過していた。

B - String Rotation

最初、回転という言葉からstd::reverseのような動作を想像した(180度回転)。しかし操作の説明を読むと違う。ABCのBは全探索という格言を思い出し、std::rotateで全探索した。

C - Modulo Summation

A mod BのBを変化させるのかと思ったらAを変化させるのかあ。Nが3000、aが10万。aの最小公倍数は大きすぎてダメ。O(max(a))みたいな全探索が利くのかなあ。いやあ、B問題じゃないんだから。ウンコがしたくなってきた。まさかこんなに難しいとは。max(a)のとこで最大にしようとして、いやダメだとか考えてて。ふと気づく。mが-1なら?天才かよ。いやあ、解けたから言うわけではないが、この問題は良い。これは気持ちいい(やっぱり解けたからじゃねえか)。具体的なmが64bit整数に収まらないほど巨大になるのが素晴らしい。ちょっと色々な探索方法を考えすぎた。力で押し切ろうというのはABCに対する甘えだ。11が12-1だと気づかなかったね。言われてみれば当たり前でこのブログを書くのも恥ずかしいくらいだが、短時間で解くからこその感動。

D - Islands War

短い問題文が怖い。そう、本当に怖いのは長い問題文じゃなくて(Cで精神をやられている)。UnionFindとかが浮かぶが、どうも逆っぽい。連結になっていてはいけないという条件なので考えにくい。逆に橋を足していくか?いやそれもダメ。色々な足し方があるので貪欲に足していってもたぶんダメ。なんか双対問題を考えれば。全然わからんけど。そもそも普通のグラフの問題と違って横一列なんだよね。状況がつかみにくい。紙の上で色々実験してみる。いくつかの状況を見たが、どちらで切ってもいいというケースが出てくるのが厄介だ。ここまでかなりの時間を使っている。
ということで、bでソートする(そして左から見ていく)ことを思いついた。あーこっちの典型かー。この段階では、まだ思考は混乱している。とりあえず構造体を用意し、ソートまで書く。これは0-indexedに直さなくてもいけそうだと思い、自分にしては珍しく直さなかった。さて、aはソートしなくてもいいことを確認する。ソートするのが無難ではあるけど、どっち向きのソートかわかんないし、書くのもめんどいし。とにかく、このアイデアの骨子はその組(a,b)の間に少なくとも一つある切断のうちの一つをb-1とbの間にして損をしないということ。それをベースに、何と何を比較すればいいか、本当にそれでいいのかを確認しながらコードを書いていく。b-1とbの間で切ることをbと表現した。書き上がってサンプルが合ったので提出。
D問題のジャッジを待つ間に、A問題の提出を持ってきて考え直す。DはAC。AもACに変わっていた。0WAで全完。それはめでたいが、順位には微妙に不満が。この前のABCがハチャメチャによかったからね。今回はトラブルもあってそれは大いに不満だが、何よりC問題を瞬殺できなかったのが一番の課題だ(Dはまあこのくらいは仕方ないという感じ)。