Soohの嘆き呟き

競プロ解説記事をかくぞ。

ABC140 F Many Slimes

  • 問題概要

atcoder.jp

始めの1つの値を決めた後、毎秒いま持ってる全ての値に対して、それより真に小さい値を手持ちに加える。最終的に与えられた配列A内の2^N個の数と一致させることができるか。

 

  • 解法

現在持ってる値の配列をcurと呼ぶことにする。

配列A内で最大である要素を、一番最初の値にしなければいけないのは明らか。

さらに、cur[i]から生み出す値は、 Aの中でまだcurから生み出されていない値であってかつ、cur[i]より小さい値のうち最大のものが最適。これは、数が大きければ大きいほど、後で生み出せる数の範囲が大きくなるため。

したがって、貪欲による解法でOK。

ちなみに、curからは大きい順に取っていく必要はない。

実装は、既に生み出したものを削除するためにmultisetを用いた。

また、Aの値を全て負の値にすることで、multisetのメンバ関数のupper_boundが使いやすくなる。

atcoder.jp