Educational Codeforces Round 75 E2. Voting (Hard Version)
お題箱より。
問題概要
選挙の投票者が 人いて、全員が自分を支持するようにしたい。投票者 が自分を支持する条件は2つあり、どちらかを満たすと支持する。
- 金額 を払って買収する。
- 他の投票者のうち 人以上が自分を支持している。
全員に自分を支持させるために必要な金額の最小値を求めよ。
制約
の複数テストケースで、各ケースは以下を満たす。
- 全ケースの の総和は 以下
解法
支持者0の状態から、1人ずつ順番に支持者を選んで増やしていくことを考えます。このとき買収金額最小化の裏返しとして、「買収せずに支持させる投票者の の合計を最大化する」ように支持者を選んでいきます。
既に 人の支持者がいて、次に 人目の支持者を選ぶ時のことを考えます。このときの選択としては、
- でありまだ選んでいない投票者がいる場合、その中で が最大である人を1人選んで支持させる。
- そうでない場合、誰かを1人買収することにする。誰を買収するかは後で決めて良い。
とするのが最適となります。その理由は、各ステップであえて損する選択(安い人を支持させたり、買収なしで支持させられる人がいるのに買収を選んだり)をしたときに、後でその損した分を上回るほどの得ができることはないからです。
これは優先度付きキューを使ってシミュレーションすることができます。具体的には支持者が 人であるような段階それぞれについて、まず であるような人の買収金額 を優先度付きキューに入れ、その後キューが空でなければ最大要素を1つキューから出せば良いです。
そして最後までキューに残った人たちが買収の対象になるので、その人たちの の合計が答えになります。