Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 5790  Solved: 2597
[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

3
0 5 10
5 3 100
9 6 10

Sample Output

32

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位带符号整数。

Source

感觉自己拿到题目还是太想当然了,连题目都没读完就开始xjb列方程,,

首先题目中有一条比较重要的性质

  • ‘产品只能往山下运

因此第$N$个工厂一定有仓库

这样的话DP方程就比较好列了,$f[i]$表示在第$i$个位置安装了仓库且前$i$个工厂都已经安置好的最优方案

设$dis[i]$表示$i$号节点到山顶的距离,$num[i]$为第$i$个工厂储存物品的数量,$spend[i]$为在第$i$个工厂建造仓库的花费

我们不难列出方程

那么$f[i]=min(f[i],\sum_{j=1}^{i-1} f[j]+Build(j,i))$

其中$Build(l,r)$为在第$r$个位置建仓库,前一个仓库在$l$的费用,

我们需要求的值为$\sum_{i=l+1}^{r-1}((dis[r]-dis[i])*num[i])+spend[r]$

但是这个并不好维护,因此我们把它拆开维护

设$g(x)=\sum_{i=1}^{x} -dis[i]*num[i]$

$sum(x)=\sum_{i=1}^{x} num[i]$

根据前缀和

$$Build(l,r)=dis[r]*(sum[r-1]-sum[l])+g[r-1]-g[l]+spend[r]$$

这样的话就有20分了

考虑继续优化,把上面的式子暴力推推推,再把只包含$i$的删去,不难得到

$f[i]+dis[i]*num[j]=f[j]-g[j]$

把$dis[i]$看成$k$

把$num[i]$看成$x$

把$f[i]$看成$b$

把$f[j]-g[j]$看成$y$

然后就能斜率优化了。

#include<cstdio>
#include<cstring>
#include<bitset>
#include<cmath>
#include<algorithm>
#define int long long
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<23,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
using namespace std;
const int MAXN=1e6+;
inline int read()
{
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int N;
int dis[MAXN],num[MAXN],spend[MAXN];
int sum[MAXN],g[MAXN];//g[i]=∑dis[i]*num[i]
int f[MAXN];
int Q[MAXN];
int Build(int l,int r)
{
return dis[r]*(sum[r-]-sum[l])+g[r-]-g[l]+spend[r];
}
double X(int x){return sum[x];}
double Y(int x){return f[x]-g[x];}
double slope(int x,int y){return ( Y(y)-Y(x) ) / ( X(y) -X(x) );}
main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
//freopen("b.out","w",stdout);
#endif
N=read();
for(int i=;i<=N;i++)
dis[i]=read(),num[i]=read(),spend[i]=read(),
g[i]=-dis[i]*num[i],g[i]+=g[i-],
sum[i]=num[i],sum[i]+=sum[i-];
for(int i=;i<=N;i++) f[i]=Build(,i);
int h=,t=;
for(int i=;i<=N;i++)
{
while(h<t&&slope(Q[h],Q[h+])<dis[i]) h++;
int j=Q[h];
f[i]=min(f[i],f[j]+Build(j,i));
while(h<t&&slope(Q[t-],Q[t])>slope(Q[t-],i)) t--;
Q[++t]=i;
}
printf("%lld",f[N]);
return ;
}

BZOJ1096: [ZJOI2007]仓库建设(dp+斜率优化)的更多相关文章

  1. BZOJ1096 ZJOI2007 仓库建设 【斜率优化DP】

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

  2. 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 ...

  3. 2018.09.07 bzoj1096: [ZJOI2007]仓库建设(斜率优化dp)

    传送门 斜率优化dp经典题. 令f[i]表示i这个地方修建仓库的最优值,那么答案就是f[n]. 用dis[i]表示i到1的距离,sump[i]表示1~i所有工厂的p之和,sum[i]表示1~i所有工厂 ...

  4. BZOJ1096 [ZJOI2007]仓库建设(斜率优化)

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

  5. BZOJ1096 [ZJOI2007]仓库建设 动态规划 斜率优化

    原文链接http://www.cnblogs.com/zhouzhendong/p/8696410.html 题目传送门 - BZOJ1096 题意 给定两个序列$a,b,X$,现在划分$a$序列. ...

  6. [BZOJ1096][ZJOI2007]仓库建设(斜率优化DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1096 分析: 假设1~10,如果在3 6 10建立仓库,那么当前建立仓库决策下的最优值 ...

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

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

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

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

  9. BZOJ 1096 [ZJOI2007]仓库建设(斜率优化DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1096 [题目大意] 有个斜坡,有n个仓库,每个仓库里面都有一些物品,物品数目为p,仓库 ...

随机推荐

  1. 判断input或者div.span等标签是否存在

    //用jQuery检查某个元素在网页上是否存在时,应该根据获取元素的长度来判断,代码如下 if($("#email"+i).length > 0){//判断input是否存在 ...

  2. Js构造对象-添加方法的三种方式

    Js构造函数添加方法有多种方案,来看一个混合方式构造函数的例子:申明person构造函数,有两个属性,name,qq.在原型上添加方法showname.这是最常用的方法. <script> ...

  3. Apex语言(八)类和对象

    1.类和对象 一切皆对象,是客观存在的万物,有标识.属性和行为.一个人,一台电脑,一辆轿车都是对象 类是创建对象的模板或蓝图,是对象的抽象,是对象的类型. 一个对象是一个类的一个实例,是一个类的变量. ...

  4. PAT_A1155#Heap Paths

    Source: PAT A1155 Heap Paths (30 分) Description: In computer science, a heap is a specialized tree-b ...

  5. [BZOJ5072] 小A的树

    设计状态\(f[i][j]\)表示以i为根的子树,包含j个点的最小黑点数,\(g[i][j]\)表示以\(i\) 为子树,包含\(j\)个点的最大黑点数,然后树形背包转移即可. 每次询问的时候就看包含 ...

  6. CentOS 7.2 x64 配置SVN服务器

    说明: SVN(subversion)的运行方式有两种: 一种是基于Apache的http.https网页访问形式,还有一种是基于svnserve的独立服务器模式. SVN的数据存储方式也有两种:一种 ...

  7. apache+php连接数据库

    ######## 安装APACHE ##############安装apr/usr/src/apache+php/tar xf apr-1.5.2.tar.gzcd apr-1.5.2./config ...

  8. ps图标长投影如何做?

    https://jingyan.baidu.com/article/2f9b480dad9c8e41cb6cc297.html ps图标长投影

  9. Spring Boot-全局异常处理(八)

    SpringBoot默认异常默认处理机制 Spring boot错误异常时通过BasicErrorController来处理的 通过判断是浏览器请求还是ajax请求响应页面或者json BasicEr ...

  10. 0926mysql中MRR的用法

    转自 http://blog.itpub.net/22664653/viewspace-1673682  [MySQL]MySQL5.6新特性之Multi-Range Read 2015-05-27 ...