問題
$N$ 個の宝箱がある。 $i$ 番目の宝箱を開けると $a_i$ 円得られる。
あなたは金を払うことで $M$ 種類の鍵を得ることができる。 $i$ 番目の鍵は $c_i$ 円するが、宝箱 $l_i$ から $r_i$ までを全て開けることができる。
利益 ($=$ 得られた金額 $-$ 払った金額) の最大値を求めよ。
制約
- $1 \leq N, M \leq 2 \cdot 10^5$
- $1 \leq a_i, c_i \leq 10^9$
考察
インライン DP を軸に考える。 $dp_i$ を「 $[1, i]$ の宝箱しかないときの利益の最大値」とすると、 宝箱を開けないときの更新式は単純に以下のようになる。
$$ dp_i \leftarrow dp_{i-1} $$
そして$ i $番目の鍵による更新式は以下のようになる。
$$ dp_{r_i} \leftarrow \max_{l_i - 1 \leq x \lt r_i} \left\{ dp_{x} + \sum_{j=x+1}^{r_i} a_j \right\} - c_i $$
しかしこのままでは $\sum_{j=x+1}^{r_i} a_j$ の項が ($x$ と $r_i$ に依存していて)邪魔なので、なんとかしなくてはならない。 そのためには、 $\sum_{j=x+1}^{r_i} a_j$ がデフォルトで加えられている、つまり 宝箱が全て開いている状態から、開けられない毎にペナルティが掛かる と問題を言い換えればよい。
$dp_i$ を「$[1, i]$ の宝箱しかないときのペナルティの最小値」と定め直す。 すると上 2 つの更新式は以下のようになる。
$$ \begin{aligned} dp_i &\leftarrow dp_{i-1} + a_i \\ dp_{r_i} &\leftarrow \min_{l_i - 1 \leq x \lt r_i} \{ dp_{x} \} + c_i \end{aligned} $$
これでセグメント木で処理できる形になった。 さらにここからグラフの最短路問題に変換することもできるが、それは公式解説を参照。
実装例
https://atcoder.jp/contests/past202010-open/submissions/18010296
|
|