2025-11-7 10:20:00 TOP-BOTTOM-THEME
Enable/Disable Transition
Copyright © 2023 ~ 2025 Sinktank - 1328312655@qq.com
Illustration from 稲葉曇『リレイアウター/Relayouter/中继输出者』,by ぬくぬくにぎりめし.

7.21 暂存

P11608 [PA 2016] 雨后的蘑菇 2 / Grzyby po deszczu 2

注意到不会有两天选择同一块地。

设前 \(i\) 天最多能采 \(f(i)\) 个蘑菇 ,第 \(j\) 天选择的地编号为 \(p_j\),则

\[\begin{align} f(i) &= \sum\limits_{j = 1}^{i}b_{p_j} + a_{p_j}\times (j - 1)\\ &= \sum\limits_{j = 1}^{i}b_{p_j} + \sum\limits_{j = 1}^{i}a_{p_j}\times (j - 1) \end{align} \]

发现需要 \(a_{p_j}\) 单调递增,排序处理。

考虑动态规划,设 \(f(i, j)\) 为只考虑前 \(i\) 块地前 \(i\) 天能采集的最多蘑菇数。显然

\[f(i, j) = \max\{f(i - 1, j), f(i - 1, j - 1) + a_i \times(j - 1) + b_i)\} \]

这个转移是 \(\mathcal{O}(n^2)\) 的,需要优化。

因为第 \(i + 1\) 天的最优方案一定是比第 \(i\) 天的最优方案多选择一块地,则如果某天的最优方案加上了一块地,那之后都应该选择了这块地。因此,上面的转移存在一个分界 \(k\),满足

\[\begin{cases} f(i, j) = f(i - 1, j)&j \lt k\\ f(i, j) = f(i - 1, j - 1) + a_i\times(j - 1) + b_i&j\ge k \end{cases} \]

存在某种继承关系,考虑用平衡树维护。但不是很好维护。

但是差分很好维护。定义 \(g(i, j) = f(i, j) - f(i, j - 1)\)

容易得到

\[\begin{cases} g(i, j) = g(i - 1, j)&j \lt k\\ g(i, k) = a_i \times (j - 1) + b_i\\ g(i, j) = g(i - 1, j -1) + a_i&j \gt k \end{cases} \]

这是好用平衡树维护的。

我实在看不懂题解在说什么

\(i + 1\) 天的最优方案一定是比第 \(i\) 天的最优方案多选择一块地

假如说是换了 \(k\) 块地,再加一块地,这说明第 \(i\) 天换 \(k\) 块地更优。

code

posted @ 2025-07-21 20:26  FRZ_29  阅读(8)  评论(0)    收藏  举报