ABC322

ABCEFの5完。Dがありえないほどつまらなかった。レーティングが下がるのは実力通りなので納得できるが、だいぶ嫌な気持ちになる。俺が力を発揮できない問題出しやがってほんと気に食わねえよ。

A - First ABC 2

findを使う。見つかったときだけ1を足す必要がある。

B - Prefix and Suffix

3番目だけ「接尾辞」が前にあるの気づかなくて混乱した。判定はsubstrと!=を使う。接頭辞でないときは2を、接尾辞でないときは1をorする。

C - Festival

配点の通り簡単なCだ。長さNのvectorを用意して、花火が上がる日だけ1にして。後ろから、最後に(時間遡行して最後にだから早い時刻ってことだけど)花火が上がった日を持ちながら答えを計算していく。好き。

D - Polyomino

全探索するだけ。4分ほど考えて、飛ばした。時間がかかりそうというのもあるが、こういうのの高速化を以前やったことがあり、それの下位互換みたいなコードを書くというのはあまりにも魅力がない。プログラミングって楽しいものだけど、それは、何かしらやったことない要素が入ってくるからで、これはもう本当にやりたくない。

敗因は左上に詰める処理を入れたこと。回転して縦横のサイズが変わることに気づいてなかった。こうすれば解けるというのが見えて、そこから抜け出せなかった。何の魅力もない問題を前にするとパフォーマンスも落ちるよね。制約を利用して実装をさぼるゲーム、自分も普通にやるけどね、これはなんかそういう気分にならなかった。

入力を受け取り、intの01に変換しておく。合計で16マスじゃなかったらNo。3個あるので再帰する。回転4通りと位置16通りを試す(最初9通りと勘違いしていた)。正方形がある場所だけチェックする。はみ出しているか既に置いてあるならダメ。そうでないなら置く。全部置けたら再帰。最後まで行ったらYes。回転するときは、一番上の位置と一番左の位置を求めてそのぶんずらす。

E - Product Development

なんか最小費用流を思ったけど、ちょっと考えてできない。フローでさえ解けないものはDPだ。6^6は7776。デコードしながらエンコードして遷移先を見つけてchmin。

F - Vacation Query

遅延セグ木を思ったが、連続とか最大とかそんな演算はないというか作用が無理だろ。で、平方分割に行った。TLギリギリに見えるけど。実装していくと思ったより大変で、また遅延セグ木に戻ってくる。01それぞれについて、左端から何個連続しているか、右端から何個連続しているか、最大で何個連続しているかを持つ。んなアホなって気もするけど、実装していくとこれでちゃんと書けてしまう。書けてしまうということは、これで解けているはずだ。コードのミスがいくつかあってサンプルがなかなか通らなかったが、そこを直してAC。中の状態がわからなくてもいいなんてDPみたいだ。