斜率优化专题5——bzoj 1096 [ZJOI2007]仓库建设 题解
来源:互联网 发布:squid软件 编辑:程序博客网 时间:2024/06/04 17:45
【原题】
1096: [ZJOI2007]仓库建设
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1998 Solved: 816
[Submit][Status]
Description
L公司有N个工厂,由高到底分布在一座山上。如图所示,工厂1在山顶,工厂N在山脚。 由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用。突然有一天,L公司的总裁L先生接到气象部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏。由于地形的不同,在不同工厂建立仓库的费用可能是不同的。第i个工厂目前已有成品Pi件,在第i个工厂位置建立仓库的费用是Ci。对于没有建立仓库的工厂,其产品应被运往其他的仓库进行储藏,而由于L公司产品的对外销售处设置在山脚的工厂N,故产品只能往山下运(即只能运往编号更大的工厂的仓库),当然运送产品也是需要费用的,假设一件产品运送1个单位距离的费用是1。假设建立的仓库容量都都是足够大的,可以容下所有的产品。你将得到以下数据: 工厂i距离工厂1的距离Xi(其中X1=0); 工厂i目前已有成品数量Pi; 在工厂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,不如前者优。【数据规模】对于20%的数据, N ≤500;对于40%的数据, N ≤10000;对于100%的数据, N ≤1000000。 所有的Xi, Pi, Ci均在32位带符号整数以内,保证中间计算结果不超过64位带符号整数。
【分析与解法】总结一下我的最近的斜率优化题目的通解。
首先声明一下,我不会证明斜率优化的正确性,大概打表或是看数据范围就知道了。
第一步:推出n^2的方程,一般是一维方程,而且通用格式是:f[i]=min/max(f[j]+G)
f[i]=min(f[j]+sum[i]-sum[j]-G[j]*(a[i].x-a[j].x)+a[i].c);
第二步:假设j<k,且k比j要优。把刚才的方程写成f[k]+G1<f[j]+G2的形式。
f[k]+sum[i]-sum[k]-G[k]*(a[i].x-a[k].x)+a[i].c<f[j]+sum[i]-sum[j]-G[j]*(a[i].x-a[j].x)+a[i].c
第三步:然后把有关k、j的项移到左边,把有关i的项移到右边。有时两边要同除一个数使得右边只剩下与i有关的成分。
抵消f[k]-sum[k]-G[k]*(a[i].x-a[k].x)<f[j]-sum[j]-G[j]*(a[i].x-a[j].x)
化简f[k]-f[j]+sum[j]-sum[k]+G[k]*a[k].x-G[j]*a[j].x<a[i].x*(G[k]-G[j])
除去(f[k]-f[j]+sum[j]-sum[k]+G[k]*a[k].x-G[j]*a[j].x)/(G[k]-G[j])<a[i].x
现在,就已经推出了斜率,再套用单调队列即可。
【代码】
#include<cstdio>#include<algorithm>#define N 1000005using namespace std;typedef long long ll;struct arr{ll x,p,c;}a[N];ll sum[N],G[N],f[N],q[N],n,i,j,h,t;bool cmp(arr a,arr b){return a.x<b.x;};double xie(long long k,long long j){ double temp=(f[k]-f[j]+sum[j]-sum[k]+G[k]*a[k].x*1.0-G[j]*a[j].x)/(G[k]-G[j]); return temp;}int main(){ scanf("%lld",&n); for (i=1;i<=n;i++) scanf("%lld%lld%lld",&a[i].x,&a[i].p,&a[i].c); sort(a+1,a+n+1,cmp); for (i=1;i<=n;i++) sum[i]=sum[i-1]+G[i-1]*(a[i].x-a[i-1].x),G[i]=G[i-1]+a[i].p; for (i=1;i<=n;i++) {while (h<t&&xie(q[h+1],q[h])<a[i].x) h++;f[i]=f[q[h]]+sum[i]-sum[q[h]]-G[q[h]]*(a[i].x-a[q[h]].x)+a[i].c;while (h<t&&xie(q[t],q[t-1])>xie(i,q[t])) t--;q[++t]=i; } printf("%lld",f[n]); return 0;}
- 斜率优化专题5——bzoj 1096 [ZJOI2007]仓库建设 题解
- BZOJ 斜率优化 1096: [ZJOI2007]仓库建设
- BZOJ 1096 ZJOI2007 仓库建设 斜率优化
- BZOJ 1096: [ZJOI2007]仓库建设(斜率优化)
- BZOJ 1096: [ZJOI2007]仓库建设 斜率优化
- BZOJ 1096: [ZJOI2007]仓库建设 斜率优化
- 【BZOJ】【P1096】【ZJOI2007】【仓库建设】【题解】【斜率优化】
- bzoj 1096: [ZJOI2007]仓库建设 斜率优化+:DP
- [BZOJ]1096: [ZJOI2007]仓库建设 斜率优化DP
- 【BZOJ】1096 [ZJOI2007]仓库建设 dp+斜率优化
- BZOJ 1096 [ZJOI2007]仓库建设 斜率优化dp
- [BZOJ 1096][ZJOI2007]仓库建设:DP斜率优化
- BZOJ 1096 [ZJOI2007]仓库建设 动态规划+斜率优化
- 【斜率DP】【bzoj 1096】: [ZJOI2007]仓库建设
- 【1096】【ZJOI2007】仓库建设 斜率优化DP
- [斜率优化]BZOJ 1096——仓库建设
- [省选前题目整理][BZOJ 1096][ZJOI2007]仓库建设(斜率优化DP)
- bzoj 1096: [ZJOI2007]仓库建设(斜率DP)
- Redmine安装指南
- ftp服务器搭建
- PHP从零单排(十八)图片处理
- mysql操作笔记
- Spring 中的default-lazy-init="true" 和 lazy-init="true"
- 斜率优化专题5——bzoj 1096 [ZJOI2007]仓库建设 题解
- Spring 反射注入+全注解注入
- 不要只和结婚的人谈恋爱 //转自《拆掉思维里的墙》
- Spring ref属性配置
- C++/C博客记录
- [BZOJ1041][HAOI2008][数学乱搞]圆上的整点
- android中intent带Uri传输时中文的乱码问题
- Nginx自定义模块编写:根据post参数路由到不同服务器
- codechef The Ball And Cups题解