题链:

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. Hibernate学习错误集锦-GenericJDBCException: could not execute statement

    初次使用Hibernate,进行junit测试,报如下错误. 原因:Hibernate帮我们管理主键了,我们不需要对主键赋值,并且主键是自增的.所以在数据库中,逐渐选项应当勾选 org.hiberna ...

  2. 201621123060《JAVA程序设计》第三周学习总结

    1. 本周学习总结 1.1写出你认为本周学习中比较重要的知识点关键词,如类.对象.封装等. 关键词:类.方法.属性.对象.多态.继承.封装.面向对象.> 1.2 用思维导图或者Onenote或其 ...

  3. Archlinux下i3wm与urxvt的配置

    前段时间学习了GitHub的两位前辈:Airblader和wlh320.他们的相关教程在https://github.com/Airblader/i3和https://github.com/wlh32 ...

  4. 201621123057 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口,interface,implements,方法签名,has-a,Comparable,Comparator. 1.2 尝试 ...

  5. python的测试

    测试 知识点 单元测试概念 使用 unittest 模块 测试用例的编写 异常测试 测试覆盖率概念 使用 coverage 模块 实验步骤 1. 应该测试什么? 如果可能的话,代码库中的所有代码都要测 ...

  6. 不高兴的小名 nyoj

    不高兴的小明 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述    小明又出问题了.妈妈认为聪明的小明应该更加用功学习而变的更加厉害,所以小明除了上学之外,还要参加妈 ...

  7. IT学习逆袭的新模式,全栈实习生,不8000就业不还实习费

    大家好: 我是马伦,也就是多年耕耘在IT培训一线的老马.老马一直怀揣普惠教育梦想初心,一直为莘莘学子能获得高质量的IT教育服务而奋斗. 之前老马在IT培训机构任职讲师多年,也有丰富的教学管理经验.接触 ...

  8. 记一次SQL调优/优化(SQL tuning)——性能大幅提升千倍以上

    好久不写东西了,一直忙于各种杂事儿,恰巧昨天有个用户研发问到我一个SQL调优的问题,说性能太差,希望我能给调优下,最近有些懒,可能和最近太忙有关系,本来打算问问现在的情况,如果差不多就不调了,那哥们儿 ...

  9. 调用WCF时,调用已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定。

    解决方案: 其实只要在客户端配置文件中加上如下紫色粗体属性( maxReceivedMessageSize): <?xml version="1.0" encoding=&q ...

  10. Django REST framework+Vue 打造生鲜超市(二)

    三.Models设计 3.1.项目初始化 (1)进虚拟环境下安装 django2.0.2 djangorestframework和相关依赖mark,filter pillow  图片处理 pip in ...