ARC166

3完。もうやだ。スピードが出なさすぎてコンテストを楽しめない体になった。

A - Replace C or Swap AB

Yの'C'はXでも'C'の必要がある。そこは動かないので、Yを'C'で区切ってそれぞれの区間を解く。ここには'A'か'B'しかなく、'A'の個数は一致する必要がある。'A'は操作によって右へ移動すると思うことができるので、足りない'A'は左から貪欲に変換してしまっていい。操作が終わったら、左から見て'A'の個数の累積でYが上回らなければOK。

考察しても簡単な事実しか出てこなくてそれで解けているというの、なんかはっきりしなくて不安になる。いやこの上なくはっきりしてるのにそう感じるのはどうなんだ?実装はそこそこあった。18分はけっこう難しい部類だと思うけどなあ。何も難しいことをしてないんだよな。

B - Make Multiples

2^3通りのlcmと、各A_iからその倍数にするために必要なコストを求めておく。lcm(a, b, c)にするなら簡単。lcm(a, b)とcにするなら、どっちを先に選ぶか2通り試せばいい。ばらばらのときがよくわからない。たぶん6通り試せばいいんだろうけど証明できない。まあ実装する。色々大変だったけど、一度使った場所を使わないようにする処理が間違っていたかつ重かった。min_elementを使うことにして、使ったところはでかい数に書き換えてあとで戻していた。同じインデックスの別のvectorを保存して変更する必要があったのだけど、同じvectorをいじっていた。こういうとこだよなあ。ここでめちゃくちゃ時間使ったけど、他の実装も重かったし、最初はMinCostFlowをしばらく考えて無理だなってなったりしてたし、まあ酷い。フローで無理ならDPというのも考えたかった。ここでゴミのような時間を過ごし破滅するの、いつもの光景すぎて本当につまらない。

C - LU / RD Marking

与えられた計算時間が短いけど、とりあえずDPを考えてみる。1次元ならまだしも2次元をどうやって高速化するのかと思っていたが、まあDPを考えてから。まず横に考えて、次に縦。なんか進行方向は右下で考えるのがよさそうか?と思ったらなんと斜めに独立に考えられるんだ。ジグザクを1個取り出して考えると、例えば4辺からなるものだったら置ける場所は3個で連続して置いたらダメ。これはフィボナッチ数列だ。まだO(H+W)だけど、掛け算するシーケンスが毎回同じようなものなので、これは累積積を持っておけばいい。真ん中は同じのがたくさんあったりするけどこれは単にpowでいい。勘違いもあって添え字ガチャをやってしまったが、普通にサンプル通るところまで行けてAC。これは面白かった。マルチテストケースで時間をかけて前計算しておくというのも好きなタイプ。

D - Interval Counts

個数(y)が極大である塊の大きさを見ればいいんだろと思ってたらサンプル2で半開区間(追記:普通に間違ってる半直線みたいのを言いたかった)出されて死んだ。