链接:

P2120


题意:

有 \(n\) 个点依次编号为 \(1\sim n\)。给出这 \(n\) 个点的信息,包括位置 \(x_i\),所拥有的的物品数量 \(p_i\),在此建设一个仓库的费用 \(c_i\)。

每个物品可以向编号更大的点移动,一个物品移动一个单位距离的费用为1。

求将所有物品都放进仓库所需的最小费用。


分析:

我们可以比较容易地想出一个 \(dp[i]\) 表示在第 \(i\) 个点建一个仓库时的最优费用,那么枚举上一个仓库的位置,有

\[dp[i]=dp[j]+\sum_{k=j+1}^i(x_i-x_k)\cdot p_k+c_i
\]

把 \(\sum\) 拆开,有

\[dp[i]=dp[j]+x_i\sum_{k=j+1}^ip_k-\sum_{k=j+1}^i(x_k\cdot p_k)+c_i
\]

于是设 \(sum1[i]=\sum\limits_{k=1}^ip_k\),\(sum2[i]=\sum\limits_{k=1}^i(x_k\cdot p_k)\),可以预处理出来。

\[dp[i]=dp[j]+x_isum1[i]-x_isum1[j]-sum2[i]+sum2[j]+c_i
\]

发现有 \(x_isum1[j]\) 这种既与当前位置有关,又与决策有关的项,于是按照斜率优化的套路,我们把式子化成直线表达式的形式:

\[(sum2[j]+dp[j])=x_isum1[j]+(dp[i]-x_isum1[i]+sum2[i]-c_i)
\]

于是我们只需要最小化斜率为 \(x_i\),过点 \((sum1[j],sum2[j]+dp[j])\) 的直线的截距。

发现和玩具装箱那题很像,也是维护一个下凸包,同样有斜率 \(x_i\) 递增,同样用单调队列优化,于是就可以 \(O(n)\) 了。


算法:

单调队列维护下凸包,同时维护最优决策点,然后每次根据最优决策的信息得到 \(dp[i]\),继续维护凸包即可。时间复杂度 \(O(n)\)。

细节1:

这个细节是仅关于本题的,也是洛谷上的 hack 数据。

我们对 dp 的定义是在第 \(i\) 个位置建一个仓库时的最优费用,于是如果 dp 完直接输出 dp[n] 是有问题的。当最后连续多个点根本没有物品时,最后一个仓库可能会建在最后一个有物品的点和最后一个点及其之间的所有点上,所以我们最后还要取一个 min

细节2:

另外,对于决策点横坐标相等的问题,由于本题数据弱放了过去,所以我会在 [SDOI2012]任务安排 的题解中详细说明这个问题。


代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define in read()
inline int read(){
int p=0,f=1;
char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){p=p*10+c-'0';c=getchar();}
return p*f;
}
#define X(x) (sum1[x])
#define Y(x) (sum2[x]+dp[x])
#define dx(x,y) (X(x)-X(y))
#define dy(x,y) (Y(x)-Y(y))
#define slope(x,y) (dx(x,y)?(double)dy(x,y)/dx(x,y):dy(x,y)>=0?inf:-inf)
const int N=1e6+5;
const int inf=0x7fffffffffffffff;
int n,x[N],p[N],c[N],dp[N],sum1[N],sum2[N],q[N],qh,qt;
signed main(){
n=in;
for(int i=1;i<=n;i++)
x[i]=in,p[i]=in,c[i]=in,
sum1[i]=sum1[i-1]+p[i],
sum2[i]=sum2[i-1]+x[i]*p[i];
qh=qt=1;
for(int i=1;i<=n;i++){
while(qh<qt&&slope(q[qh+1],q[qh])<x[i])qh++;
dp[i]=Y(q[qh])-x[i]*X(q[qh])+x[i]*sum1[i]-sum2[i]+c[i];
if(X(i)==X(q[qt])&&qh<qt){if(Y(i)<Y(q[qt]))qt--;else continue;}
while(qh<qt&&slope(q[qt],q[qt-1])>slope(i,q[qt-1]))qt--;
q[++qt]=i;
}
int ans=dp[n];
while(!p[n])ans=min(ans,dp[--n]);
cout<<ans;
return 0;
}

洛谷 P2120 [ZJOI2007] 仓库建设的更多相关文章

  1. 洛谷P2120 [ZJOI2007]仓库建设 斜率优化DP

    做的第一道斜率优化\(DP\)QwQ 原题链接1/原题链接2 首先考虑\(O(n^2)\)的做法:设\(f[i]\)表示在\(i\)处建仓库的最小费用,则有转移方程: \(f[i]=min\{f[j] ...

  2. 洛谷2120 [ZJOI2007]仓库建设(斜率优化dp)

    感觉和锯木厂那个题很类似的. 其实这个题还那个题唯一的区别就是\(dp\)转移式子中的\(f\)变成了\(g\) qwq不想多说了 直接看我的前一篇题解吧qwq #include<iostrea ...

  3. P2120 [ZJOI2007]仓库建设

    P2120 [ZJOI2007]仓库建设 怎么说呢?算是很水的题了吧... 只要不要一开始就把dp想错就行... #include<bits/stdc++.h> #define ll lo ...

  4. P2120 [ZJOI2007]仓库建设 斜率优化dp

    好题,这题是我理解的第一道斜率优化dp,自然要写一发题解.首先我们要写出普通的表达式,然后先用前缀和优化.然后呢?我们观察发现,x[i]是递增,而我们发现的斜率也是需要是递增的,然后就维护一个单调递增 ...

  5. P2120 [ZJOI2007] 仓库建设(斜率优化DP)

    题意:\(1\sim N\) 号工厂,第\(i\) 个工厂有\(P_i\)个成品,第\(i\)个工厂建立仓库需要\(C_i\)的费用,该工厂距离第一个工厂的距离为\(X_i\),编号小的工厂只能往编号 ...

  6. P2120 [ZJOI2007]仓库建设(dp+斜率优化)

    思路 首先暴力DP显然,可以得20分 加上一个前缀和优化,可以得到40分 然后上斜率优化 设\(sum_i\)为\(\sum_{1}^iP_i\),\(sump_i\)为\(\sum_{1}^{i}P ...

  7. 【洛谷】2120:[ZJOI2007]仓库建设【斜率优化DP】

    P2120 [ZJOI2007]仓库建设 题目背景 小B的班级数学学到多项式乘法了,于是小B给大家出了个问题:用编程序来解决多项式乘法的问题. 题目描述 L公司有N个工厂,由高到底分布在一座山上. 工 ...

  8. bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

    题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...

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

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

随机推荐

  1. Excel删除重复数据及用公式筛选重复项并标记颜色突出显示

    当表格记录比较多时,常常会有重复数据,而重复记录往往只希望保存一条,因此需要把多余的删除:在 Excel 中,删除重复数据有两种方法,一种是用"删除重复数据"删除,另一种是用&qu ...

  2. Android——ProgressBar(进度条)

    参考资料来源于菜鸟教程--学的不仅是技术,更是梦想! 学习! 1.常用属性讲解与基础实例 从官方文档,我们看到了这样一个类关系图: ProgressBar继承与View类,直接子类有AbsSeekBa ...

  3. 【OI技巧】解决cin、cout因输入输出慢而TLE的问题

    语言本身没有问题!! 语言本身没有问题!! 语言本身没有问题!! C++本来的设计就是将输入输出流和C的标准输入输出挂钩在一起,这样就导致cin,cout输入输出前先要将内容放入缓冲区,最后再由cin ...

  4. css3 animate转圈360旋转

    .logo{ width:20px; height: 20px; background: red; -webkit-animation:haha1 .8s linear infinite; anima ...

  5. 限制只有VIP会员才能下载Ecshop文章页的附件

    以官方2.7.2默认模板为基础来讲述一下"如何在文章详情页限制只有VIP会员才能下载相关附件"这里假设VIP会员的等级ID为2首先修改 article.php 文件打开 /arti ...

  6. layui 添加复选框checkbox后,无法正确显示及点击的方法

    layui 添加复选框checkbox后,无法正确显示方式,这个是由于html里的样式添加 layui-form后,没有加载 form插件 ,具体如下: <body style="ba ...

  7. CF346E-Doodle Jump【类欧】

    正题 题目链接:https://www.luogu.com.cn/problem/CF346E 题目大意 给出\(a,n,p,h\),在每个\(ax\%p(x\in[0,n])\)的位置有一个关键点, ...

  8. @ConfigurationProperties与@Value的区别

    1. 首先我们来看每一个的具体使用 1. ConfigurationProperties 1. application.yml文件中: person: lastName: xj age: 18 bos ...

  9. ElasticSearch搜索引擎

    官网:Elasticsearch:官方分布式搜索和分析引擎 | Elastic Elaticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储.检索数据;本身扩 ...

  10. 一个故事,一段代码告诉你如何使用不同语言(Golang&C#)提供相同的能力基于Consul做服务注册与发现

    目录 引言 什么是微服务 传统服务 微服务 什么是服务注册与服务发现 为什么要使用不同的语言提供相同的服务能力 服务协调器 服务注册 Golang C#(.NetCore3.1) 服务发现 通过Htt ...