bzoj1096[ZJOI2007]仓库建设 斜率优化dp
1096: [ZJOI2007]仓库建设
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 5482 Solved: 2448
[Submit][Status][Discuss]
Description
L公司有N个工厂,由高到底分布在一座山上。如图所示,工厂1在山顶,工厂N在山脚。由于这座山处于高原内
陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用。突然有一天,L公司的总裁L先生接到气象
部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏。由于
地形的不同,在不同工厂建立仓库的费用可能是不同的。第i个工厂目前已有成品Pi件,在第i个工厂位置建立仓库
的费用是Ci。对于没有建立仓库的工厂,其产品应被运往其他的仓库进行储藏,而由于L公司产品的对外销售处设
置在山脚的工厂N,故产品只能往山下运(即只能运往编号更大的工厂的仓库),当然运送产品也是需要费用的,
假设一件产品运送1个单位距离的费用是1。假设建立的仓库容量都都是足够大的,可以容下所有的产品。你将得到
以下数据:1:工厂i距离工厂1的距离Xi(其中X1=0);2:工厂i目前已有成品数量Pi;:3:在工厂i建立仓库的费用
Ci;请你帮助L公司寻找一个仓库建设的方案,使得总的费用(建造费用+运输费用)最小。
Input
第一行包含一个整数N,表示工厂的个数。接下来N行每行包含两个整数Xi, Pi, Ci, 意义如题中所述。
Output
仅包含一个整数,为可以找到最优方案的费用。
Sample Input
0 5 10
5 3 100
9 6 10
Sample Output
HINT
在工厂1和工厂3建立仓库,建立费用为10+10=20,运输费用为(9-5)*3 = 12,总费用32。如果仅在工厂3建立仓库,建立费用为10,运输费用为(9-0)*5+(9-5)*3=57,总费用67,不如前者优。
【数据规模】
对于100%的数据, N ≤1000000。 所有的Xi, Pi, Ci均在32位带符号整数以内,保证中间计算结果不超过64位带符号整数。
可以发现把一段区间的物品统一移向i点的代价=把这些物品都从i点移向1号点的代价 - 把这些点从本来的位置移向1号点的代价
可以推出dp方程式
dp[i]=dp[j]+(d[i]-d[j])*x[i]-(sum[i]-sum[j])+c[i];
其中
d[i]=d[i-1]+p[i]
sum[i]=sum[i-1]+x[i]*p[i]
p[i]表示i仓库产品数量
x[i]表示i与1之间距离
首先证明决策单调性
1.设j>k && 对于i来说j的决策优于k
dp[j]+(d[i]-d[j])*x[i]-(sum[i]-sum[j])<=dp[k]+(d[i]-d[k])*x[i]-(sum[i]-sum[k])
化简得 dp[j]-x[i]*d[j]+sum[j]<=dp[k]-x[i]*d[k]+sum[k]
2.假设决策单调 那么对于任意t,t>i来说
都有 dp[j]+(d[t]-d[j])*x[t]-(sum[t]-sum[j])<=dp[k]+(d[t]-d[k])*x[t]-(sum[t]-sum[k])
3.需要证明上式来得证决策单调性
上式化简得 dp[j]-x[t]*d[j]+sum[j]<=dp[k]-x[t]*d[k]+sum[k]
因为x[t]>=x[i] 所以设 x[t]=x[i]+v
x[t]代入上式可得 (dp[j]-x[i]*d[j]+sum[j])-v*d[j]<=(dp[k]-x[i]*d[k]+sum[k])-v*d[k]
因为j>k&&d表示前缀和&&给出的产品数量没有负数
所以 d[j]>=d[k] -v*d[j]<=-v*d[k]
上式得证
因此决策单调性得证
证毕
斜率表达式 设j>k且j更优
dp[j]-d[j]*x[i]+sum[j]<=dp[k]-d[k]*x[i]+sum[k]
=> dp[j]-dp[k]+sum[j]-sum[k]<=(d[j]-d[k])*x[i]
=> (dp[j]-dp[k]+sum[j]-sum[k])/(d[j]-d[k])<=x[i]
G=dp[j]-dp[k]+sum[j]-sum[k]
S=d[j]-d[k]
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdlib>
#include<iostream>
#define ll long long
#define inf 2147483647
#define N 1000005
using namespace std;
int c[N],x[N],p[N],q[N];
ll dp[N],sum[N],d[N];
ll G(int j,int k){return dp[j]-dp[k]+sum[j]-sum[k];}
ll S(int j,int k){return d[j]-d[k];} int main(){
int n;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d%d",&x[i],&p[i],&c[i]);
sum[i]=sum[i-]+(ll)x[i]*p[i];
d[i]=d[i-]+p[i];
}
int t=,h=;q[]=;
for(int i=;i<=n;i++){
while(h+<t&&G(q[h+],q[h])<=S(q[h+],q[h])*x[i])h++;
dp[i]=(ll)dp[q[h]]+(d[i]-d[q[h]])*x[i]*1ll-(sum[i]-sum[q[h]])+c[i];
while(h+<t&&G(i,q[t-])*S(q[t-],q[t-])<=G(q[t-],q[t-])*S(i,q[t-]))t--;
q[t++]=i;
}
printf("%lld",dp[n]);
return ;
}
bzoj1096[ZJOI2007]仓库建设 斜率优化dp的更多相关文章
- bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)
题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...
- 【bzoj1096】[ZJOI2007]仓库建设 斜率优化dp
题目描述 L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L ...
- BZOJ 1096: [ZJOI2007]仓库建设 [斜率优化DP]
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4201 Solved: 1851[Submit][Stat ...
- 【BZOJ-1096】仓库建设 斜率优化DP
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3719 Solved: 1633[Submit][Stat ...
- P2120 [ZJOI2007]仓库建设 斜率优化dp
好题,这题是我理解的第一道斜率优化dp,自然要写一发题解.首先我们要写出普通的表达式,然后先用前缀和优化.然后呢?我们观察发现,x[i]是递增,而我们发现的斜率也是需要是递增的,然后就维护一个单调递增 ...
- 洛谷P2120 [ZJOI2007]仓库建设 斜率优化DP
做的第一道斜率优化\(DP\)QwQ 原题链接1/原题链接2 首先考虑\(O(n^2)\)的做法:设\(f[i]\)表示在\(i\)处建仓库的最小费用,则有转移方程: \(f[i]=min\{f[j] ...
- [ZJOI2007] 仓库建设 - 斜率优化dp
大脑真是个很优秀的器官,做事情之前总会想着这太难,真的逼着自己做下去,回头看看,其实也不过如此 很朴素的斜率优化dp了 首先要读懂题目(我的理解能力好BUG啊) 然后设\(dp[i]\)表示处理完前\ ...
- [BZOJ1096] [ZJOI2007] 仓库建设 (斜率优化)
Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天, ...
- 【bzoj1096】仓库建设 斜率优化dp
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1096 [题解] 设输入的三个数组为a,b,c sumb维护b数组的前缀和,sumab维护a ...
随机推荐
- css3动画 一行字鼠标触发 hover 从左到右颜色渐变
偶然的机会发现的这个东东 这几天做公司的官网 老板突然说出了一个外国网站 我就顺手搜了 并没有发现他说的高科技 但是一个东西深深地吸引了我 就是我下面要说的动画 这个好像不能放视频 我就简单的描述一 ...
- 第一次PTA作业
题目6-1拆分实数整数及小数部分 1设计思路 (1) 第一步:阅读题目要求及所给部分. 第二步:根据题意补全相应函数. (2)流程图 无 2.实验代码 #include <stdio.h> ...
- mingw打dll ,lib包命令和调用
1,下面的命令行将这个代码编译成 dll. gcc mydll.c -shared -o mydll.dll -Wl,--out-implib,mydll.lib 其中 -shared 告诉gcc d ...
- asp.net(C#)实现功能强大的时间日期处理类完整实例
作者:smartsmile2012 字体:[增加 减小] 类型:转载 时间:2016-06-30我要评论 这篇文章主要介绍了asp.net(C#)实现功能强大的时间日期处理类,封装了针对日期与时间的各 ...
- AOP及专有名词通俗解答
AOP面向切面编程,是一种编程思想,并不是Spring专有,Spring是封装代理模式完成,之前的博客中也写到了关于AOP的文章,Filter和代理,请见<以此之长,补彼之短----AOP(Fi ...
- 用UIWebView加载本地图片和gif图
加载gif图: NSData *gif = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@" ...
- Linux磁盘分区-rpm-yum
一.磁盘分区 1.开启Linux系统前添加一块大小为15G的SCSI硬盘 2.开启系统,右击桌面,打开终端 3.为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区 ...
- Hibernate(五):Hibernate配置文件及C3P0的用法
配置文件可配项: 参考文档:hibernate-release-5.2.9.Final/documentation/userguide/html_single/Hibernate_User_Guide ...
- 1.3WEB API 默认以json格式返回数据,同时定义时间格式,返回格式
首先我们知道,web api 是可以返回任意类型的,然后在输出的过程中转为(默认的)xml. 但是xml是比较费流量的,而且大多前端都是用json对接,所以我们也只能随大流,把它输出改成json. 不 ...
- 在vue项目中, mock数据
1. 在根目录下创建 test 目录, 用来存放模拟的 json 数据, 在 test 目录下创建模拟的数据 data.json 文件 2.在build目录下的 dev-server.js的文件作如下 ...