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

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

可以发现把一段区间的物品统一移向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的更多相关文章

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

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

  2. 【bzoj1096】[ZJOI2007]仓库建设 斜率优化dp

    题目描述 L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L ...

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

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

  4. 【BZOJ-1096】仓库建设 斜率优化DP

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

  5. P2120 [ZJOI2007]仓库建设 斜率优化dp

    好题,这题是我理解的第一道斜率优化dp,自然要写一发题解.首先我们要写出普通的表达式,然后先用前缀和优化.然后呢?我们观察发现,x[i]是递增,而我们发现的斜率也是需要是递增的,然后就维护一个单调递增 ...

  6. 洛谷P2120 [ZJOI2007]仓库建设 斜率优化DP

    做的第一道斜率优化\(DP\)QwQ 原题链接1/原题链接2 首先考虑\(O(n^2)\)的做法:设\(f[i]\)表示在\(i\)处建仓库的最小费用,则有转移方程: \(f[i]=min\{f[j] ...

  7. [ZJOI2007] 仓库建设 - 斜率优化dp

    大脑真是个很优秀的器官,做事情之前总会想着这太难,真的逼着自己做下去,回头看看,其实也不过如此 很朴素的斜率优化dp了 首先要读懂题目(我的理解能力好BUG啊) 然后设\(dp[i]\)表示处理完前\ ...

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

    Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天, ...

  9. 【bzoj1096】仓库建设 斜率优化dp

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1096 [题解] 设输入的三个数组为a,b,c sumb维护b数组的前缀和,sumab维护a ...

随机推荐

  1. Twisted 介绍 及TCP广播系统实例

    twisted 提供更多传输层 udp,tcp,tls及应用层HTTP,FTP等协议的支持,在开发方法上更提供了丰富的特性来支持异步编程 安装twisted 建议使用anaconda 安装,conda ...

  2. iOS开发点滴-添加阴影效果

    UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:_backView.bounds]; _backView.layer.masks ...

  3. it's a big trick

    今天,正式的登上了我注册已久的博客园,最初注册园子得出发点是记录生活点滴和学习工作的心得的,那就不忘初心,从头开始吧. 从校园到工作,从东北到南方 我们毕业啦 谁说毕业遥遥无期,转眼就要各奔东西. 是 ...

  4. 读论文系列:Object Detection ECCV2016 SSD

    转载请注明作者:梦里茶 Single Shot MultiBox Detector Introduction 一句话概括:SSD就是关于类别的多尺度RPN网络 基本思路: 基础网络后接多层featur ...

  5. 工频相位无线同步模块PSYN5000系列在高压设备状态检测和局部放电故障定位的应用方案

    关键词: PSYN5000,无线同步模块,工频相位,局部放电,在线监测,高压设备,设备状态,故障定位. 前言: 在电力监测领域,出于方便和安全考虑,有些系统不得不采用无线通信的方式,在这样一个无线通信 ...

  6. Hadoop学习笔记一(HDFS架构)

    介绍 Hadoop分布式文件系统(HDFS)设计的运行环境是商用的硬件系统.他和现存的其他分布式文件系统存在很多相似点.不过HDFS和其他分布式文件系统的区别才是他的最大亮点,HDFS具有高容错的特性 ...

  7. apigw鉴权分析(1-2)腾讯开放平台 - 鉴权分析

    一.访问入口 http://wiki.open.qq.com/wiki/%E8%85%BE%E8%AE%AF%E5%BC%80%E6%94%BE%E5%B9%B3%E5%8F%B0%E7%AC%AC% ...

  8. 19届华为实习生笔试之判断iPv6地址类型

    题二: 答案: #coding=utf-8 import re,sys str = sys.stdin.readline().strip() def regex(str): result = &quo ...

  9. JavaScript简单重写构造器的原型

    //简单重写原型对象: //一个构造函数Person function Person(){ } //重写Person的原型 //把Person的原型赋值给一个新的对象 是我们重写的过程 Person. ...

  10. mysql导出与导入

    环境 centos6.5 32位 Mysql 5.7.19 导出 mysqldump用法 导出整个数据库 [root@mini2 mysql]# mysqldump -p123456 --databa ...