BZOJ1096: [ZJOI2007]仓库建设(dp+斜率优化)
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
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位带符号整数。
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+斜率优化)的更多相关文章
- BZOJ1096 ZJOI2007 仓库建设 【斜率优化DP】
BZOJ1096 ZJOI2007 仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般 ...
- 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 ...
- 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所有工厂 ...
- BZOJ1096 [ZJOI2007]仓库建设(斜率优化)
题目背景 小B的班级数学学到多项式乘法了,于是小B给大家出了个问题:用编程序来解决多项式乘法的问题. 题目描述 L公司有N个工厂,由高到底分布在一座山上. 工厂1在山顶,工厂N在山脚. 由于这座山处于 ...
- BZOJ1096 [ZJOI2007]仓库建设 动态规划 斜率优化
原文链接http://www.cnblogs.com/zhouzhendong/p/8696410.html 题目传送门 - BZOJ1096 题意 给定两个序列$a,b,X$,现在划分$a$序列. ...
- [BZOJ1096][ZJOI2007]仓库建设(斜率优化DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1096 分析: 假设1~10,如果在3 6 10建立仓库,那么当前建立仓库决策下的最优值 ...
- 【洛谷】2120:[ZJOI2007]仓库建设【斜率优化DP】
P2120 [ZJOI2007]仓库建设 题目背景 小B的班级数学学到多项式乘法了,于是小B给大家出了个问题:用编程序来解决多项式乘法的问题. 题目描述 L公司有N个工厂,由高到底分布在一座山上. 工 ...
- 【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3940 Solved: 1736 Description ...
- BZOJ 1096 [ZJOI2007]仓库建设(斜率优化DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1096 [题目大意] 有个斜坡,有n个仓库,每个仓库里面都有一些物品,物品数目为p,仓库 ...
随机推荐
- Django逻辑关系
title: Django学习笔记 subtitle: 1. Django逻辑关系 date: 2018-12-14 10:17:28 --- Django逻辑关系 本文档主要基于Django2.2官 ...
- 【JavaScript游戏开发】JavaScript+HTML5封装的苏拉卡尔塔游戏(包含源码)
/** 苏拉克尔塔游戏 * 思路: * 1.棋盘设置:使用HTML5的canvas标签绘制整个棋盘 * 2.点击事件:当页面被点击时,获取点击的x,y像素点,根据此像素点进行判断,再在合适位置绘制黑红 ...
- 如何快速从数据库获取表属性编写JavaBean
以前自己对子设计好的数据库将数据库中的表转换为JavaBean,自己还一个一个慢慢打效率真是低,还是老师比较聪明学习学习. 我用的数据库可视化工具是Navicat Premium.UltraEdit( ...
- 09.正则表达式re-2.complie函数
compile 函数用于编译正则表达式,生成一个 Pattern 对象,它的一般使用形式如下: import re # 将正则表达式编译成 Pattern 对象 pattern = re.compil ...
- matplotlib的annotate用法小结
这个是matplotlib自定义的annotate方法的文本: 一. def annotate(self, s, xy, *args, **kwargs): a = mtext.Annotation( ...
- HDU 4456 Crowd
Crowd Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 洛谷 P1602 Sramoc问题
题目描述 话说员工们整理好了筷子之后,就准备将快餐送出了,但是一看订单,都傻眼了:订单上没有留电话号码,只写了一个sramoc(k,m)函数,这什么东西?什么意思?于是餐厅找来了资深顾问团的成员,YQ ...
- [bzoj1614][Usaco2007Jan]Telephone Lines 架设电话线_二分答案_最短路
Telephone Lines bzoj-1614 Usaco-2007Jan 题目大意:给你一个n个点m条边的带边权无向图,求最短路.可以选取k条边免费. 注释:$1\le n\le 10^3$,$ ...
- Maven错误:[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?的解决方法
错误: [ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather tha ...
- currentThread()方法返回代码段正在被哪个线程调用
currentThread()方法返回代码段正在被哪个线程调用 package com.stono.thread2.page16; public class MyThread extends Thre ...