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 ...
随机推荐
- SQLite 带你入门
SQLite数据库相较于我们常用的Mysql,Oracle而言,实在是轻量得不行(最低只占几百K的内存).平时开发或生产环境中使用各种类型的数据库,可能都需要先安装数据库服务(server),然后才能 ...
- LeetCode & Q53-Maximum Subarray-Easy & 动态规划思路分析
Array DP Divide and Conquer Description: Find the contiguous subarray within an array (containing at ...
- 关于kali linux 2.0的vmware tools的安装问题
在安装好kali linux 2.0 后,首先要做的就是添加源并更新系统,否则会出现软件定位问题. 在kali 2.0中,vmware tools已经不能使用了,官方放了一个工具下载安装就好. 添加源 ...
- c# aynsc 和 await
static void Main(string[] args) { Print(); Console.WriteLine("这是主线程"); } public static a ...
- Jetty入门(1-3)Eclipse集成gradle-Gretty插件或maven-jetty插件运行应用
英文来源: http://akhikhl.github.io/gretty-doc/Getting-started.html 一.gradle插件 1.使用gretty来运行jetty: gradl ...
- maven入门(8)maven的依赖管理
我们项目中用到的jar包可以通过依赖的方式引入,构建项目的时候从Maven仓库下载即可. 1. 依赖配置 依赖可以声明如下: <project> ... <dependenci ...
- Python模块 - os , sys.shutil
os 模块是与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录: ...
- spring cloud zipkin sleuth与spring boot aop结合后,启动慢
问题描述: 引入了spring cloud的监控starter,间接引入jooq. 又引入了 spring-boot-starter-web,所以间接引入aop. 参考下面资料后:https://gi ...
- tomcat增加处理线程数量
修改server.xml <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" ma ...
- 归档(NSKeyedArchiver)的使用
归档的使用,是归于使用保存数据,但是一些简单的数据,如数组,字典等基本的数据类型,往往不使用在归档中,归档和plist以及UserDefaults最大的区别就在于,前者可以存放自定义的数据类型,而后两 ...