Official

D - Shipping Center Editorial by kyopro_friends


クエリごとに独立に問題を解きます(前処理などは必要ありません)

どのような基準で箱に入れる荷物を決めるのがよいか考えます。以下の2種類の方法で最大値を得ることができます。

  • 価値の大きな荷物から順に、その荷物を入れることができる大きさ最小の箱に入れる
  • 大きさの小さな箱から順に、その箱に入れることができる価値最大の荷物を入れる
証明
前者のみを示します。後者も同様の方針で示すことができます。簡単のため、荷物の価値と箱の大きさは相異なるとします。(一般の場合も適切な変形によりこのケースに帰着できます)
どのような箱詰め方法から始めても、価値の合計を減らすことなくこの詰め方に変更できることを示します。
価値の大きい荷物から順にすべての荷物に対して次の操作をします。

操作:
いま注目している荷物を $A$ とする。
価値が$A$ 未満の荷物が入っている箱のうち、$A$ を入れることができる箱が存在すれば、そのような最小の箱に着目する。(荷物の入っていない箱は、価値 $0$ の荷物が入っているとみなす)
・そのような箱が存在しなければ何もしない。
・そうではなく、もし $A$ が現時点でどの箱にも入っていないなら、着目した箱から荷物を取り出し、かわりに $A$ を入れる。
・そうではなく、もし $A$ が現時点で入っている箱が着目した箱より大きいなら、この2つの箱の中身を入れ替える。
・そうではなく、もし $A$ が現時点で入っている箱が着目した箱より小さいなら何もしない。

この操作は荷物の個数回だけ行われ、各操作により箱に入っている荷物の価値の合計は非減少で、操作が終了した時点で箱に入っている荷物は最初に述べた方法による結果と一致しています。

2 種類のどちらの方法でもクエリあたり \(O(NM)\) で答えを求めることができます。

なお、セグメントツリーなどを適切に用いることで、クエリあたり \(O(N\log M)\)\(O(M\log N)\) で解くこともできます。

posted:
last update: