洛谷 P2120 [ZJOI2007] 仓库建设
链接:
题意:
有 \(n\) 个点依次编号为 \(1\sim n\)。给出这 \(n\) 个点的信息,包括位置 \(x_i\),所拥有的的物品数量 \(p_i\),在此建设一个仓库的费用 \(c_i\)。
每个物品可以向编号更大的点移动,一个物品移动一个单位距离的费用为1。
求将所有物品都放进仓库所需的最小费用。
分析:
我们可以比较容易地想出一个 \(dp[i]\) 表示在第 \(i\) 个点建一个仓库时的最优费用,那么枚举上一个仓库的位置,有
\]
把 \(\sum\) 拆开,有
\]
于是设 \(sum1[i]=\sum\limits_{k=1}^ip_k\),\(sum2[i]=\sum\limits_{k=1}^i(x_k\cdot p_k)\),可以预处理出来。
\]
发现有 \(x_isum1[j]\) 这种既与当前位置有关,又与决策有关的项,于是按照斜率优化的套路,我们把式子化成直线表达式的形式:
\]
于是我们只需要最小化斜率为 \(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] 仓库建设的更多相关文章
- 洛谷P2120 [ZJOI2007]仓库建设 斜率优化DP
做的第一道斜率优化\(DP\)QwQ 原题链接1/原题链接2 首先考虑\(O(n^2)\)的做法:设\(f[i]\)表示在\(i\)处建仓库的最小费用,则有转移方程: \(f[i]=min\{f[j] ...
- 洛谷2120 [ZJOI2007]仓库建设(斜率优化dp)
感觉和锯木厂那个题很类似的. 其实这个题还那个题唯一的区别就是\(dp\)转移式子中的\(f\)变成了\(g\) qwq不想多说了 直接看我的前一篇题解吧qwq #include<iostrea ...
- P2120 [ZJOI2007]仓库建设
P2120 [ZJOI2007]仓库建设 怎么说呢?算是很水的题了吧... 只要不要一开始就把dp想错就行... #include<bits/stdc++.h> #define ll lo ...
- P2120 [ZJOI2007]仓库建设 斜率优化dp
好题,这题是我理解的第一道斜率优化dp,自然要写一发题解.首先我们要写出普通的表达式,然后先用前缀和优化.然后呢?我们观察发现,x[i]是递增,而我们发现的斜率也是需要是递增的,然后就维护一个单调递增 ...
- P2120 [ZJOI2007] 仓库建设(斜率优化DP)
题意:\(1\sim N\) 号工厂,第\(i\) 个工厂有\(P_i\)个成品,第\(i\)个工厂建立仓库需要\(C_i\)的费用,该工厂距离第一个工厂的距离为\(X_i\),编号小的工厂只能往编号 ...
- P2120 [ZJOI2007]仓库建设(dp+斜率优化)
思路 首先暴力DP显然,可以得20分 加上一个前缀和优化,可以得到40分 然后上斜率优化 设\(sum_i\)为\(\sum_{1}^iP_i\),\(sump_i\)为\(\sum_{1}^{i}P ...
- 【洛谷】2120:[ZJOI2007]仓库建设【斜率优化DP】
P2120 [ZJOI2007]仓库建设 题目背景 小B的班级数学学到多项式乘法了,于是小B给大家出了个问题:用编程序来解决多项式乘法的问题. 题目描述 L公司有N个工厂,由高到底分布在一座山上. 工 ...
- bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)
题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...
- BZOJ 1096: [ZJOI2007]仓库建设 [斜率优化DP]
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4201 Solved: 1851[Submit][Stat ...
随机推荐
- djang2.1教育平台02
在次申明,之所以重做这个资料是因为原幕课教程漏洞太多,新手根本没有办法正常照些学习,我凭着老男孩python 课程基础,重做这个教程 ,更改版本为当前最新版本,为了方法以后的人学习,并不是照着原文照 ...
- 多线程run()方法是不能够被直接调用的
操作系统线程的五种状态: 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于"可运行 ...
- 洛谷P1781——宇宙总统(高精度排序)
题目描述 地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竟选总统,现在票数已经统计完毕,请你算出谁能够当上总统. 输入输出格式 输入格式: 第一行为一个整数n,代表竞选 ...
- 使用 VSCode 开发调试 STM32 单片机尝试
使用 VSCode 开发调试 STM32 单片机尝试 本文记录基于 Windows + DAP-Link 开发 STM32F103C8T6 的实践过程,其他操作系统或芯片应该也只是大同小异的问题. 注 ...
- 学习PHP中的目录操作
对于编程语言来说,文件和目录的操作是其最最基础的功能.就像我们日常中最常见的图片上传.文件上传之类的功能,都需要文件和目录操作的支持.今天我们先来简单地学习一下 PHP 中关于目录操作的一些类和函数. ...
- DS博客作业04--图
这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业04--图 这个作业的目标 学习图结构设计及相关算法 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1. ...
- Docker系列(13)- 部署es+kibana
部署elasticsearch # es 暴露的端口很多 # es 十分的消耗内存 # es 的数据一帮需要放置到安全目录!通过挂载实现 # DockerHub上安装文档,其中 --net somen ...
- 华为云计算IE面试笔记-FusionSphere Openstack有哪些关键组件,各组件主要功能是什么?三种存储接入组件的差异有哪些?
1. Nova:在OpenStack环境中提供计算服务,负责计算实例(VM,云主机)生命周期的管理,包括生成.调度和回收.Nova不负责计算实例的告警上报(FC管). 2. Cinder:为计算实例提 ...
- 我是小白,做PPT像流水账,怎么做一份重点突出的PPT?
1.PPT的封面不要只写标题,还要在显眼的位置写上你的核心观点.比如,你之前做的PPT封面标题是<A产品市场前景分析>,现在不妨加上一个副标题<红海市场中需要找到更多本产品卖点> ...
- Redis Windows 服务启动异常 错误码1067
https://blog.csdn.net/after_you/article/details/62215163 Redis Windows 服务启动异常 错误码1067 下载了Redis 2.8.2 ...