JOI 2013本選4 JOIOIの塔 遠回りな解法

遠回りな解法で解いたので,記録します。

共通考察

JOIとIOIは「OI」の部分を共有しているので,OIから考える。

まず,OIの「I」の部分はできるだけ後ろから取っても損しない。 (ここを前に残しても選択肢が少ないので)

そして,OIの「O」の部分は各「I」より前にあるもので,「I」に最も近いものを取ればよい。(同上)

また,「OI」グループはOが後ろにあればあるほど使いやすい。

想定の賢い方法

「OI」を何個使うかで二分探索して,JとIを適当に結合させる。

Rhoの賢くない方法

「J」とOIに結合できなかった「I」のindexの集合を  X とし,「OI」の「O」のindexの集合を  Y とする。 Y の小さい方から何要素かを  Y から削除し,各「O」に付随する「I」のindexをそれぞれ  X に挿入する。 そうして作った  X Y x < y となるようにマッチングを組むとき,最大で何本組めるか?という問題になる。

 Y から1要素削って  X に追加した時,減るマッチングはYの要素が減ってあぶれた高々1個である。また,1要素増えることもある。よってこれは凸関数で,三分探索ができる。 計算量がちょっとやばめだが,通る。

感想

想定解賢すぎるだろ