#xLYHDPybttg050606. 1611:仓库建设
1611:仓库建设
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
原题来自:ZJOI 2007
L 公司在山上有一些工厂。由于这座山处于高原内陆地区(干燥少雨),L 公司一般把产品直接堆放在露天,以节省费用。突然有一天,L 公司的总裁 L 先生接到气象部门的电话,被告知三天之后将有一场暴雨,于是 L 先生决定紧急在某些工厂建立一些仓库以免产品被淋坏。
L 公司在山上有 个工厂。如图所示,工厂 在山顶,工厂 在山脚。由于地形的不同,在不同工厂建立仓库的费用可能不同。工厂 目前已有成品 件,在该厂建立仓库的费用为 。对于没有建立仓库的工厂,其产品应被运往其他的仓库进行储藏,而由于 L 公司产品的对外销售处设置在山脚的工厂 ,故产品只能往山下运(即只能运往编号更大的工厂的仓库),当然运送产品也是需要费用的,假设一件产品运送 个单位距离的费用是 。假设建立的仓库容量都足够大,可以容下所有的产品。
已知:
- 工厂 距离工厂 的距离 (其中 );
- 工厂 目前已有成品数量 ;
- 在工厂 建立仓库的费用 。
请你帮助 L 公司寻找一个仓库建设的方案,使得总的费用(建造费用+运输费用)最小。
输入格式
第一行包含一个整数 ,表示工厂的个数。
接下来 行,每行包含三个整数 ,意义如题中所述。
输出格式
仅包含一个整数,为可以找到最优方案的费用。
样例
样例输入
3
0 5 10
5 3 100
9 6 10
样例输出
32
样例说明
工厂数据:
- X=0, P=5, C=10
- X=5, P=3, C=100
- X=9, P=6, C=10
最优方案:在工厂 和工厂 建立仓库。
- 工厂 建立费用:10;
- 工厂 建立费用:10;
- 运输费用:工厂 的产品运到工厂 ,距离 ,运输费用 ;
- 总费用 。
如果只在工厂 建立仓库:
- 工厂 产品运到工厂 :距离 ,费用 ;
- 工厂 产品运到工厂 :费用 ;
- 建造费用 ;
- 总费用 ,不如方案优。
数据范围
对于全部数据:
- 保证所有的 均在 int 范围以内
- 保证中间计算结果不超过 long long 范围
时空限制
- 时间:
- 内存:
提示
此题为 斜率优化 DP 问题。
状态设计: 设 表示在工厂 建立仓库,且前 个工厂的所有产品都得到妥善处理的最小总费用。
转移方程: 考虑上一个仓库建在 (),则 之间的工厂的产品都运到 仓库。
费用包括:
- 在 建仓库的费用 ;
- 从 到 这些工厂的产品运到 的运输费用;
- (前 个工厂的最小费用)。
运输费用计算: 设 表示 的前缀和, 表示 的前缀和。 则从 ()运到 的费用为 。 总运输费用为:
$$X_i \times (sumP[i-1] - sumP[j]) - (sumXP[i-1] - sumXP[j])$$因此转移方程为:
$$dp[i] = C_i + X_i \times (sumP[i-1] - sumP[j]) - (sumXP[i-1] - sumXP[j]) + dp[j]$$整理得:
$$dp[i] = C_i + X_i \times sumP[i-1] - sumXP[i-1] + \min_{0 \le j < i} \{ dp[j] - X_i \times sumP[j] + sumXP[j] \}$$令 , ,则:
$$dp[i] = C_i + X_i \times sumP[i-1] - sumXP[i-1] + \min_{0 \le j < i} \{ B_j - X_i \times A_j \}$$斜率优化: 对于 ,决策 优于 的条件为:
$$\frac{B_{j_2} - B_{j_1}}{A_{j_2} - A_{j_1}} \le X_i$$由于 单调递增(工厂从山顶到山脚距离递增), 单调递增(),因此可以用单调队列维护下凸包,队首为最优决策。
步骤:
- 计算前缀和 , ;
- 初始化队列,将 入队();
- 遍历 从 到 :
- 若队首两点斜率 ,则弹出队首;
- 取队首 计算 ;
- 将 加入队尾,维护凸包(弹出队尾上凸点);
- 输出 (注意:必须在 建仓库吗?不一定,但我们可以虚拟一个 工厂,距离为 ,,然后答案取 ,或者直接算 时认为 必须建仓库,但实际最优方案可能不在 建,不过由于产品只能往山下运,最后一个有产品的工厂必须建仓库,但 可能为 0,所以需要小心。常见做法是:设 表示前 个工厂处理完毕的最小费用,不一定在 建仓库,但这样转移更复杂。标准做法是:在 建虚拟仓库,费用 0,距离不变)。
通常解法:设 表示在 建仓库且前 个工厂处理完毕的最小费用,最后答案即为 (因为产品只能往山下运,最后一个有产品的工厂必须建仓库,但 可能为 0,不过 建仓库费用可能不为 0,但我们可以选择不在 建,而将产品运到更远的虚拟仓库?实际上因为销售处在 ,所以最终产品必须到 ,所以要么在 建,要么在之前建并运到 ,但这样运输费用会增加。更常见的处理:在输入数据最后添加一个虚拟工厂 ,,然后计算 作为答案)。
复杂度 。