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公司寻找一个仓库建设的方案,使得总的费用(建造费用+运输费用)最小。 N ≤1000000。

      --by BZOJ
http://www.lydsy.com/JudgeOnline/problem.php?id=1096


首先明确一点,虽然原题是编号小的往编号大处运,但是出于习惯,本人将整个序列翻转,然后题目就变成从大往小运输了
(其实是因为博主一开始读错题了)
首先如果我们已经确定在哪些地方建仓库了,那么有就近运输的原则:
即一个工厂的物品向最近的仓库运输;
即确定了最后一个仓库,在此前面的仓库的数量和位置不影响之后的决策,应使其局部最优;
于是有如下方程:
//f[i]=f[j]+x[j+1]+sum1[i]-sum1[j]-len[j+1]*(s[i]-s[j]);

x[i]:在i建仓库的费用;

len[i]:i到1的距离;

s[i]:前i个工厂的物品和;

sum1[i]:把前i个工厂的物品运至1处的总费用,sum[i]=sum[i-1]+len[i]*(s[i]-s[i-1]);

(再次强调:本人将整个序列翻转,然后题目就变成从大往小运输了)

枚举最后一个仓库的位置为j+1,则前j个位置取最优值f[j],之后的花费是建仓库的x[j+1]和把之后的物品运到j+1位置的费用;

然后因为数据范围,所以需要斜率优化:

//f[i]=f[j]+x[j+1]+sum1[i]-sum1[j]-len[j+1]*(s[i]-s[j]);
//f[i]=-len[j+1]*s[i]+f[j]+x[j+1]-sum1[j]+len[j+1]*s[j]+sum1[i];
//f[i]=Y+sum1[i];
//Y=K*s[i]+B;
//K=-len[j+1];
//B=f[j]+x[j+1]-sum1[j]+len[j+1]*s[j];

维护上凸即可;

代码如下:

#include<cstdio>
#define ll long long
using namespace std;
long long Y(int ,int );
long long K(int );
long long B(int );
int cmp(int ,int ,int );
int n;
int que[];
long long f[],x[],sum1[],len[],s[];
int main()
{
int i,j,k,h=,t=;
long long nu1;
scanf("%d",&n);
for(i=;i<=n;i++){
scanf("%lld%lld%lld",&len[n-i+],&s[n-i+],&x[n-i+]);
}
nu1=len[];
for(i=;i<=n;i++){
len[i]=nu1-len[i];
sum1[i]=sum1[i-]+s[i]*len[i];
s[i]+=s[i-];
}
for(i=;i<=n;i++){
while(h<t&&Y(i,que[h])>=Y(i,que[h+]))h++;
f[i]=(ll)Y(i,que[h])+sum1[i];
while(h<t&&cmp(i,que[t],que[t-]))
t--;
que[++t]=i;
}
printf("%lld",f[n]);
return ;
}
long long Y(int i,int j){
long long k;
k=K(j)*s[i]+B(j);
return k;
}
long long K(int j){
return -len[j+];
}
long long B(int j){
return f[j]+x[j+]-sum1[j]+len[j+]*s[j];
}
int cmp(int x1,int p,int x3){
long long k1=K(x1),k2=K(p),k3=K(x3),b1=B(x1),b2=B(p),b3=B(x3);
ll w1=(k1-k3)*(b2-b1);
ll w2=(k1-k2)*(b3-b1);
return w1<=w2;
}

BZOJP1096[ZJOI2007]仓库建设——solution的更多相关文章

  1. 【洛谷】2120:[ZJOI2007]仓库建设【斜率优化DP】

    P2120 [ZJOI2007]仓库建设 题目背景 小B的班级数学学到多项式乘法了,于是小B给大家出了个问题:用编程序来解决多项式乘法的问题. 题目描述 L公司有N个工厂,由高到底分布在一座山上. 工 ...

  2. bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

    题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...

  3. BZOJ 1096: [ZJOI2007]仓库建设 [斜率优化DP]

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4201  Solved: 1851[Submit][Stat ...

  4. 【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3940  Solved: 1736 Description ...

  5. bzoj 1096: [ZJOI2007]仓库建设 斜率優化

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2242  Solved: 925[Submit][Statu ...

  6. bzoj 1096 [ZJOI2007]仓库建设(关于斜率优化问题的总结)

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3234  Solved: 1388[Submit][Stat ...

  7. BZOJ 1096: [ZJOI2007]仓库建设( dp + 斜率优化 )

    dp(v) = min(dp(p)+cost(p,v))+C(v) 设sum(v) = ∑pi(1≤i≤v), cnt(v) = ∑pi*xi(1≤i≤v), 则cost(p,v) = x(v)*(s ...

  8. 边坡优化主题5——bzoj 1096 [ZJOI2007]仓库建设 解决问题的方法

    [原标题] 1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1998  Solved: 816 [id=10 ...

  9. bzoj1096[ZJOI2007]仓库建设 斜率优化dp

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5482  Solved: 2448[Submit][Stat ...

随机推荐

  1. graphviz画图与中文乱码等问题总结

    最近想写一些文档,画一些程序的逻辑图,用了vision,markdown等软件感觉不怎么好用,于是找到graphviz,这款强大的软件.下面介绍一些入门,还有自己在用的过程中遇到的问题 1.中文乱码的 ...

  2. QuantLib 金融计算——基本组件之 Index 类

    目录 QuantLib 金融计算--基本组件之 Index 类 QuantLib 金融计算--基本组件之 Index 类 Index 类用于表示已知的指数或者收益率,例如 Libor 或 Shibor ...

  3. 将参数传递给ASP.NET Core 2.0中的中间件

    问题 在ASP.NET Core的安装过程中,如何将参数传递给中间件? 解 在一个空的项目中添加一个POCO类来保存中间件的参数, publicclass GreetingOptions { publ ...

  4. CentOS7.6下模拟iSCSI,Windows来连

    如题,在CentOS7上模拟一个iSCSI设备,然后在Windows Server 2008上连接这个iSCSI设备 第一步,CentOS7上的操作.CentOS7上安装iSCSI模拟器需要3个包,我 ...

  5. 二分难题 && deque

    141. Sqrt(x) https://www.lintcode.com/problem/sqrtx/description?_from=ladder&&fromId=4 publi ...

  6. Hibernate中Query.list()方法报IllegalArgumentException异常

    最近在使用Hibernate开发项目,在写好hql语句,并初始化Query对象,执行Query.list()方法时,应用报IllegalArgumentException异常.经网上查询,现已经基本决 ...

  7. IO流(二)字符流

    1.字符流:在字节流的基础上添加了编码机制.很大程度上和字节流操作一样的,字符流只能操作文本类文件,准确的说应该是纯文本类文件.例如.txt,.java,.cpp,.html等 编码:每一个国家都有自 ...

  8. 部署herko小记

    1 先执行如下 heroku run rake db:migrate

  9. Win10正式版关机时自动更新怎么关闭

    http://jingyan.baidu.com/article/64d05a02462d6fde55f73b97.html

  10. Linux shell ${}简单用法

    转自:Linux shell ${}简单用法 为了完整起见,我这里再用一些例子加以说明 ${ } 的一些特异功能:假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.t ...