【バチャ】CODE-FESTIVAL-2016-QUALC

3完+Dの部分点。今回はDがとっかりなくて座ってるだけバチャになるかと思ったが、Eが(全く解けないけれども)考えがいがあってよかった。これでCODE FESTIVAL 2016の予選3回のバチャが終わった(予選3回は多くない?)。

A - CF

前から順に見てCを拾い状態(最初0)をインクリメント、Fを拾い状態をインクリメント、状態が2になっていたらYes。貪欲に拾っていけばいい。

(解説を読んで)二重ループという手があるのか。

B - K個のケーキ / K Cakes

200点がわかんなくて焦る。しばらく考えて、過半数のものがなければ答えは0でありそうなことに気づく。重要なのは、複数種類のケーキが過半数を占めることはないということ。一番多い種類が何個あるかだけ注目すればいい。ここからもやや大変。同じ種類をK個並べた状態だとK-1が答えで、そこから1個を違うものに置換するたびに答えは2減る。

答えが0のときに具体的な順番を構成する方法がわからないまま提出した。0101010121222みたいな出力しそう。いやーわからん。

(追記)解説のように挿入するときに、残り数が一番多い種類を使えばいいか。挿入が終わったとき、残った一番多い種類の個数は2番目よりも高々1個多いだけになっている(最初に一番多いものへ挿入したので次に多いのだけ使ったら多くても1個しか残らない)。あとは残ったもので同じ問題を解けばいい。

C - 二人のアルピニスト / Two Alpinists

これもパッと見なにもわからない。糸口をつかんだところでトイレへ(つかむ前に行ったほうが効率はいいが仕方ないので実装もトイレで頑張って想像した)(緊張も少しはあるけど、食べ過ぎたのが大きい)。最大値が更新されたときは、その山の高さがそれであることが確定する。そうでないときは、山の高さはそれ以下であることがわかる。その情報を2人ぶん合成すればいい。実装をまとめるのがかなり大変。まず入力を受け取り、各山について情報を合成する。区間の共通部分ではあるけど、それもめんどくさそうなので4通りに場合分けした。

D - Friction

1列ずつ処理するのが最適かと思いきや、同じ色が出会わないように交互に動かすケースもありそう。考えても、この問題が難しいという結果しかでてこない。何もとっかかりがない。

部分点があったことに気づく。DPでできそうなので、残り時間をこれに使う。DPテーブルのサイズがO(H^3)で、更新がO(1)でできればいい。そのために、隣り合う2列の沈めた回数から一致する個数を前計算しておく(2乗でできそうだが愚直に3乗で間に合う)。そして後ろから貰うDPをする。15分くらいで実装しきれたのはえらい。

E - 順列辞書 / Encyclopedia of Permutations

ある順列が辞書順で何番目か求める処理を考える。例えば入力例5なら、最初に3より小さいものを選ぶと3が3番目から2番目になり番号の和が全部なんかの階乗くらい減る。そういう寄与を全部上手く集めればいけるんじゃないかと思った。解けそうな見た目になった。しかし、あまりにも遠い。自分の能力を超えていそうで考える(進む)のが嫌になる。しかしそれを1時間考えたら解けるということもたまにはあるので、少しずつでも考え続ける。確定している数の立場で自分より左に自分より小さいものがちょうど何個のが何通りというのはなんとか求まりそう。だが計算量が部分点でも不安だし、そもそもそれをてきとうに足したところで答えになっているのか全然わからない。