题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=1096

题解:

斜率优化DP

$(d_i:i 位置到1位置的距离,p_i:i位置的成品数量,c_i:i位置建仓库的费用)$

先来定义dp数组:

令DP[i]表示在i位置建立仓库,且1~i位置都安排完毕的最小总花费。

转移:

$DP[i]=min(DP[j]+W(j+1{~}i位置的物品挪动到i位置的代价)+c_i)$

看看W如何计算:

$W=(d_i-d_{i})p_{i}+(d_i-d_{i-1})p_{i-1}+\cdots+(d_i-d_{j+1})p_{j+1}$

$\quad=d_i(p_i+p_{i-1}+\cdots+p_{j+1})-(d_{i}p_{i}+d_{i-1}p_{i-1}+\cdots+d_{j+1}p_{j+1})$

令$sump_i=p_i+p_{i-1}+\cdots+p_{1}$,$sumdp_i=d_ip_i+d_{i-1}p_{i-1}+\cdots+d_{1}p_{1}$

所以

$W=d_i(sump_i-sump_j)-(sumdp_i-sumdp_j)$

$\quad=d_isump_i-sumdp_i-d_isump_j+sumdp_j$

然后把W写进DP转移,(若j转移给i的话):

$DP[i]=(d_isump_i-sumdp_i+c_i)-(d_isump_j)+(sumdp_j+DP[j]))$

一个典型的可以用斜率优化的转移。


令 $Y_j=DP[j]+sumdp_j$

若对于当前计算的DP[i],存在两个转移来源点 k,j,k < j,且j优于k

则得到

$Y_j-d_isump_j-(Y_k-d_isump_k)<0$

化简:$\frac{Y_j-Y_k}{sump_j-sump_k}<d_i$

令Slope(j,k)=$\frac{Y_j-Y_k}{sump_j-sump_k}$,

则得到结论:$若k < j,且Slope(j,k)<d_i,则j优于k$。

那么如果存在 k<j<i,且Slope(i,j)<Slope(j,k),则j是无效点,舍去。

同时注意到$d_i$单增,所以可以用单调队列维护。

最终的复杂度 O(N)

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 1000050
#define ll long long
using namespace std;
ll d[MAXN],p[MAXN],c[MAXN];
ll DP[MAXN],sump[MAXN],sumdp[MAXN];
int N;
struct Moque{
int q[MAXN],l,r;
#define Y(j) (DP[j]+sumdp[j])
#define X(j) (sump[j])
#define Slope(j,k) (1.0*Y(j)-Y(k))/(1.0*X(j)-X(k))
void Reset(){l=r=1;q[1]=0;}
void Push(int i){
if(l<=r&&X(i)==X(q[r]))
{if(Y(i)<Y(q[r])) r--; else return;}
while(l+1<=r&&Slope(i,q[r])<Slope(q[r],q[r-1])) r--;
q[++r]=i;
}
int Query(int i){
while(l+1<=r&&Slope(q[l+1],q[l])<d[i]) l++;
return q[l];
}
}Q;
void read(ll &x){
static int sn; static char ch;
x=0; sn=1; ch=getchar();
while(ch<'0'||'9'<ch){if(ch=='-')sn=-1;ch=getchar();}
while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
x=x*sn;
}
int main(){
scanf("%d",&N);
for(int i=1;i<=N;i++){
read(d[i]); read(p[i]); read(c[i]);
sump[i]=p[i]+sump[i-1];
sumdp[i]=d[i]*p[i]+sumdp[i-1];
}
Q.Reset();
for(int i=1,j;i<=N;i++){
j=Q.Query(i);
DP[i]=d[i]*sump[i]-sumdp[i]+c[i]-d[i]*sump[j]+sumdp[j]+DP[j];
Q.Push(i);
}
printf("%lld",DP[N]);
return 0;
}

  

●BZOJ 1096 [ZJOI2007]仓库建设的更多相关文章

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

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

  2. bzoj 1096: [ZJOI2007]仓库建设 斜率優化

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2242  Solved: 925[Submit][Statu ...

  3. bzoj 1096 [ZJOI2007]仓库建设(关于斜率优化问题的总结)

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

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

  5. 边坡优化主题5——bzoj 1096 [ZJOI2007]仓库建设 解决问题的方法

    [原标题] 1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1998  Solved: 816 [id=10 ...

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

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

  7. BZOJ 1096 ZJOI2007 仓库建设 边坡优化

    标题效果:特定n植物,其中一些建筑仓库,有一点使,假设没有仓库仓库向右仓库.最低消费要求 非常easy边坡优化--在此之前刷坡优化的情况下,即使这道题怎么错过 订购f[i]作为i点建设化妆i花费所有安 ...

  8. BZOJ 1096 [ZJOI2007]仓库建设:斜率优化dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1096 题意: 有n个工厂,从左往右排成一排,分别编号1到n. 每个工厂里有p[i]件产品, ...

  9. bzoj 1096: [ZJOI2007]仓库建设【斜率优化】

    好眼熟啊 直接dp显然很难算,所以设val为只在n点建一个仓库的费用,然后设f[i]为在i~n点建若干仓库并且i点一定建一个仓库的最大省钱数 转移很显然,设s为p的前缀和,f[i]=max{f[j]+ ...

随机推荐

  1. 1013团队Beta冲刺day3

    项目进展 李明皇 今天解决的进度 完善了程序的运行逻辑(消息提示框等) 明天安排 前后端联动调试 林翔 今天解决的进度 向微信官方申请登录验证session以维护登录态 明天安排 继续完成维护登录态 ...

  2. Scrum 冲刺 第一日

    Scrum 冲刺 第一日 站立式会议 燃尽图 Alpha 阶段认领任务 明日任务安排 项目预期任务量 成员贡献值计算规则 今日贡献量 参考资料 站立式会议 返回目录 燃尽图 返回目录 Alpha 阶段 ...

  3. 洛谷P2894 [USACO08FEB]酒店Hotel

    P2894 [USACO08FEB]酒店Hotel https://www.luogu.org/problem/show?pid=2894 题目描述 The cows are journeying n ...

  4. 多种在线地图综合对比,Google,必应,arcgis Online...

    不同网络地图的对比 天地图 坐标系:WGS84 地图配色:   POI数量:丰富      有无建筑:有 地图特点:天地图按照国家标准进行配图,道路.水系.植被等图层用对应颜色渲染, POI信息丰富, ...

  5. HTML5 canvas绘制雪花飘落

    Canvas是HTML5新增的组件,它就像一块幕布,可以用JavaScript在上面绘制各种图表.动画等. 没有Canvas的年代,绘图只能借助Flash插件实现,页面不得不用JavaScript和F ...

  6. js判断flash文件是否加载完毕

    轮询判断加载进度 img的加载完成有onload方法,一直不知道该怎么判断swf文件是否加载完毕了? 在应用中使用了轮询判断加载进度值PercentLoaded是否达到100,经测试,可以达到效果. ...

  7. EasyUI中easyui-combobox的onchange事件。

    html: <select id="cbox" class="easyui-combobox" name="dept" style=& ...

  8. Web Api 接收图片

    public async Task<HttpResponseMessage> Upload() { if (!Request.Content.IsMimeMultipartContent( ...

  9. redis入门(06)各种类型的操作命令

    Redis 字符串命令下表列出了常用的 redis 字符串命令:序号 命令及描述1 SET key value 设置指定 key 的值2 GET key 获取指定 key 的值.3 GETRANGE ...

  10. ELK学习总结(2-3)Mget获取多个文档

     mget 获取多个文档 1.curl 命令格式:mget获取多个文档: curl  'localhost:9200/_mget'  -d  '{ "docs":[ { " ...