Loading

[ZJOI2007] 仓库建设

前言

这些题全部口胡, 到李超线段树了再打代码

好累啊, 昨晚上不该太晚睡的, 中午他们期末也没睡, 精神萎靡

思路

先简化一下题意

对于 \(n\) 个点, 第 \(i\) 个点所在的位置为 \(x_i\) , 其有 \(p_i\) 个物品, 在 \(i\) 点建立仓库的费用为 \(c_i\) , 求建造仓库的点集 \(\mathbb{S}\) , 使得 $\displaystyle cost = \sum_{p \in \mathbb{S}} c_p + \sum_{p_k \in \mathbb{S}} \sum_{i = p_{k - 1} + 1}^{p_k - 1} p_i (x_i - x_{p_k}) $ 最小

容易发现, 问题可以进一步简化成

对于 \(n\) 个点, 第 \(i\) 个点所在的位置为 \(x_i\) , 其有 \(p_i\) 个物品, 在 \(i\) 点建立仓库的费用为 \(c_i\) , 将 \(n\) 个点划分成任意长度的段 \([L, R]\) , 一个段的花费为 \(\displaystyle c_R + \sum_{i = L}^{R} p_i (x_R - x_i)\)

容易发现贡献柿子可以进一步优化成

\[\begin{align*} & c_R + \sum_{i = L}^{R} p_i (x_R - x_i) \\ = & c_R + \sum_{i = L}^{R} x_R p_i -x_i p_i \\ \end{align*} \]

写成转移, 套路的令 \(f_i\) 表示考虑到前 \(i\) 个点的最优花费, 记 \(w_i\) 表示 \(x_i p_i\)

\[\begin{align*} f_i & = \min_{j = 0}^{i - 1} f_j + c_i + x_i (prep_i - prep_j) - (prew_i - prew_j) \\ & = x_i prep_i - prew_i + \min_{j = 0}^{i - 1} f_j - x_i prep_j + prew_j \end{align*} \]

容易搞成斜率优化的形式, 简单的做即可

特别的, 有后缀 \(p_i = 0\) , 贪心的取 \({f_i}_{\min}\) 即可

posted @ 2025-01-10 16:50  Yorg  阅读(18)  评论(0)    收藏  举报