第一回日本最強プログラマー学生選手権決勝 C - Maximize Minimum
問題
座標にイチゴの乗った長さのケーキに対して、回目の操作後のケーキの美しさを求める。
操作は、 * 座標にイチゴがないなら、座標にイチゴを乗せる * 座標にイチゴがあるなら、座標のイチゴを取り除く
ケーキの美しさは、次の値の最大値として定義する。 1. 0個以上のイチゴの座標を座標に移動する(座標にイチゴがあるときは移動できない) 2. 移動後のもっとも近い2つのイチゴの最小値を求める
考察
座標にあるイチゴは座標に移動する。座標にあるイチゴは同じ位置にあるものと考え、全てのイチゴの座標から へ移動する。ここで、同じ座標に2つのイチゴがあることは、一旦いいものとする。これで、全てのイチゴの(座標以下になった。
移動後のイチゴの座標を昇順に並べて、とする。連続する3つのイチゴのうち、少なくとも2つは半分に割った時の同じ側にいるので、これらの3つの座標の差の最小値の最大値はである。帰納的に、全てのイチゴを昇順に並べたあと、奇数番目はそのまま、偶数番目はへ移動するのがいいことがわかる。また、中心軸を挟んだ両はしにあるイチゴは隣り合っているので、も最小距離の候補になる。
イチゴを1つ追加するときの操作を考える。 座標とイチゴが並んでいるとき、上記の移動後の2つのイチゴの距離は、である。 これに座標にイチゴを追加する()。再び、上記の移動を行うと、2つのイチゴの距離は、である。 これらを追加、削除する。 イチゴを削除するときは、この逆の操作を行えばいい。
実装
感想
実装でmultisetを使ったが、multisetのeraseは値を指定すると全部消える、をやってしまった。