N - Bench Editorial
by
hint908
\(k\) 人座るために必要な金額の最小値を求めることができれば、各クエリについては二分探索により答えが分かります。
グループ \(j\) ( \(=j\) 番目のグループ) が必ず座ることができるような必要十分条件を考えます。
これまでのグループによって、空いているクッションは \(j\) 個の区間に分かれています。各区間に存在する空いているクッション数がすべて \(A_j\) 個未満であればグループ \(j\) は座れず、逆に \(A_j\) 個以上である区間が \(1\) つでもあればグループ \(j\) は座ることができます。
空いているクッションの数は \(\displaystyle L-\sum_{i=1}^{j-1} A_i\) 個なので、\(\displaystyle (A_j-1)j \geq L-\sum_{i=1}^{j-1} A_i\) であればグループ \(j\) が座れないようにでき、逆に \(\displaystyle (A_j-1)j < L-\sum_{i=1}^{j-1} A_i\) であればグループ \(j\) は必ず座れます。
\(dp_{j,k} := (j\) 番目のグループまでで、合計 \(k\) 人座るためにかかる金額の最小値\()\) とすると、\(dp_{j,k+l}\) は \(\displaystyle (k-1)j < L-l\) を満たす \(l\) に対する \(\{dp_{j-1,l} + (グループ j を k 人にするのに必要な金額)\}\) の最小値です。
\(O(NL^2)\) 時間の dp に見えますが、\(\displaystyle (k-1)j < L-l\) より \(\displaystyle k \leq \frac{L}{j} + 1\) である \(k\) のみ考慮すれば \(O(NL\log N)\) 時間となります。
最後に dp から \(k\) 人座るために必要な金額の最小値を各 \(k\) について求めます。
\(B\) が負であるようなグループの人数を減らしておくことでお金を稼ぐことができるため、\(k\) 人座るために必要な金額の最小値は \(\min_j(dp_{j,k})\) ではなく、 \(\displaystyle \min_j(dp_{j,k} + \sum_{j<l \land B_l < 0} (A_l - 1)B_l)\) です。
posted:
last update:
