P5785 [SDOI2012]任务安排
本题解用于本蒟蒻加深算法印象,也欢迎大家阅读
本篇题解将分为四块,一步一步地讲解本题,
Part 1: O(n^3)
\(n^3\) 算法应该非常的显然,我们设 \(f_{i,j}\) 为到 \(i\) 个任务,分为 \(j\) 个批次所使用的最少时间,易得转移方程为:
f_{i,j}=min(f_{k,j-1}+(sumt_i+s*j)*(suma_i-suna_k))\\
(0\le k<i)
\end{array}
\]
但是这个复杂很明显是过不了的( \(O(n^2)\) 都过不了,这还想过???),所以我们考虑优化。
Part 2: O(n^2)
因为每一个前面的 \(s\) 是每次会对后面的动态规划产生影响的,所以我们考虑在设计状态的时候就将 \(s\) 考虑进去,即 \(f_i\) 表示到第 \(i\) 个点,前面 \(i\) 个点的实际用时与 \(s\) 对于后面的影响值的和最小值,这个思想叫做费用提前,我们可以结合状态转移方程来一起食用:
f_i=min(f_j+sumt_i*(suma_i-suma_j)+s*(suma_n-suma_j)\\
(0\le j<i)
\end{array}
\]
看上去好像没什么问题,最优子结构是成立的,这个复杂度是 \(O(n^2)\) 。
Part 3: O(n)
来到今天的重头戏——斜率优化。
我们可以先看看这题的弱化版。转移方程和题目大意是一模一样的,唯一的不同点是 \(t_i\) 是非负的。
对于上面的状态的转移方程,我们进行一些移项:
f_i=min(f_j+sumt_i*(suma_i-suma_j)+s*(suma_n-suma_j)\\
\\
f_i=f_j+sumt_i*suma_i-sumt_i*suma_j+s*suma_n-s*suma_j\\
\\
f_j=(sumt_i+s)*suma_j+f_i-sumt_i*suma_i-s*suma_n
\end{array}
\]
此时,如果我们将 \(suma_j\) 看作自变量, \(f_j\) 看作因变量,对于每一个 \(i\) , \(sumt_i\),\(suma_i\),\(suma_n\),\(s\)又都是定值,我们可以将这个式子看作一个待定 \(f_i\) 值的函数。
对于这个函数,我们要使得 \(f_i\) 的数值最小,就是使得函数的截距最小(因为其他的都是定植),而如何找到使得函数截距最小的点呢?我们来画一下图:
可以发现,我们将这个函数的直线向上移动的时候,最先碰到的一个点就是满足条件的点,而我们如何维护这么一个点呢,我们可以发现一些可能的点的性质:
任意两个可能的点的连线下侧不能有点存在
所有可能被选中的点构成的集合中,相邻的两个点的斜率是单调递增的,即下凸壳。
大家可以结合图像理解理解:
因为这个函数的斜率 \(sumt_i+s\) 是单调递增的,因为 \(t_i\) 是非负的,所以我们可以发现,对于已经放弃的点,最后也不可能被重新启用。
而每进入一个点时,由于 \(suma_i\) 是单调递增的(因为 \(a_i\) 是非负的),所以我们是向着 \(x\) 轴正方向更新点的,根据性质 \(1\) ,如果这个点向当前最右点连线后,有点出现在直线的下方,则说明最右点不成立,而之后也不可能成立。
结合上面两种操作和性质 \(2\) ,我们可以想到用单调队列维护,维护方式就是上面的操作。
代码如下:
while(head<tail&&cal(q[head],q[head+1])<=sumt[i]+s)
++head;
f[i]=f[q[head]]+sumt[i]*(suma[i]-suma[q[head]])+s*(suma[n]-suma[q[head]]);
while(head<tail&&cal(q[tail-1],q[tail])>=cal(q[tail-1],i))
--tail;
q[++tail]=i;
Part 4: O(nlogn)
而针对这一道题目,我们可以发现 \(t_i\) 是有负的,所以我们第一操作就必须放弃了,因为函数的斜率并非是单调递增的。
但是我们依旧可以维护下凸壳的单调性,而对于当前遍历到的函数斜率,我们可以通过二分的方式找到符合条件的点,即该点与其左侧点的连线斜率小于函数斜率,该点与其右侧殿的连线的斜率大于函数斜率。
代码如下:
int l=head,r=tail-1,mid,res=q[tail];
while(l<=r)
{
mid=(l+r)>>1;
if(cal(q[mid],q[mid+1])>sumt[i]+s)
{
res=q[mid];
r=mid-1;
}
else
l=mid+1;
}
f[i]=f[res]+sumt[i]*(suma[i]-suma[res])+s*(suma[n]-suma[res]);
while(head<tail&&cal(q[tail-1],q[tail])>=cal(q[tail-1],i))
--tail;
q[++tail]=i;
总结
我们可以发现,得出斜率优化函数的方法是提取出关于 \(j\) 项,只要能拆出关于 \(j\) 的一次项,剩下的项塞到等号的另一边,就可以进行斜率优化了。
P5785 [SDOI2012]任务安排的更多相关文章
- 洛谷 P5785 [SDOI2012] 任务安排
链接: P5785 弱化版:P2365 题意: 有 \(n\) 个任务待完成,每个任务有一个完成时间 \(t_i\) 和费用系数 \(f_i\),相邻的任务可以被分成一批.从零时刻开始这些任务会被机器 ...
- BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )
考虑每批任务对后面任务都有贡献, dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N) F, T均为后缀和. 与j有关 ...
- [bzoj P2726] [SDOI2012]任务安排
[bzoj P2726] [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1204 Solved: 349[Submit] ...
- BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]
2726: [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 868 Solved: 236[Submit][Status ...
- 【BZOJ2726】[SDOI2012]任务安排 斜率优化+cdq分治
[BZOJ2726][SDOI2012]任务安排 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若 ...
- [BZOJ2726][SDOI2012]任务安排(DP+凸壳二分)
2726: [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1580 Solved: 466[Submit][Statu ...
- BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分
BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这 ...
- 笔记-[SDOI2012]任务安排
笔记-[SDOI2012]任务安排 [SDOI2012]任务安排 \(f_i\) 表示分配到第 \(i\) 个任务的最小费用. 令 \(st_i=\sum_{h=1}^iT_h\),\(sc_i=\s ...
- bzoj 2726: [SDOI2012]任务安排
Description 机 器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的 若干任务.从时刻0开始,这 ...
随机推荐
- UNP——第五章,TCP客户/服务程序
tcpser void str_echo(int sockfd) { long arg1, arg2; ssize_t n; char line[MAXLINE]; for ( ; ; ) { if ...
- inkscope完整安装配置
准备centos7基础系统 首先安装基础系统centos7 在安装选项那里选择base web server ,选择其他的也可以,选择mini安装会缺很多常用的软件包,后续需要一个个安装比较麻烦 关闭 ...
- vue实现增删改查(内附源代码)
VUE+Element实现增删改查 @ 目录 VUE+Element实现增删改查 前言 实验步骤 总结: 源代码 前言 &最近因为一些原因,没有更博客,昨天老师布置了一个作业,用vue实现增删 ...
- 面试阿里,字节,美团必看的Spring的Bean管理详解
IOC容器 工厂只负责创建对象,而Spring当然不仅仅是一个对象工厂,其核心是一个对象容器,其具备控制反转的能力,所以也称为IOC容器. 帮助我们存放对象,并且管理对象,包括:创建.销毁.装配,这样 ...
- 在IDM上设置防止过度抓取网站信息
在使用Internet Download Manager(IDM)下载器时,有时会发现IDM自带的抓取功能过于强大,以至于有时会抓取一些无效的链接.那么,该如何避免IDM的过度抓取呢? 图1:IDM的 ...
- 手把手教你用思维导图软件iMindMap制作计划表
在日常生活中小编也经常使用思维导图软件iMindMap来创建思维导图以规划工作及学习的安排.尤其是时间安排类型的思维导图,能极大程度的节约我们的时间,接下来就由小编以自己假期的社会实践向大家分享一下怎 ...
- 最全总结 | 聊聊 Python 办公自动化之 Word(下)
1. 前言 关于 Word 文档的读写,前面两篇文章分别进行了一次全面的总结 最全总结 | 聊聊 Python 办公自动化之 Word(上) 最全总结 | 聊聊 Python 办公自动化之 Word( ...
- Jmeter(二十八) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy1(详解教程)
1.简介 在使用jmeter自动录制脚本时会产生很多无用的请求,所以推荐使用badboy录制脚本之后保存为jmx文件,在jmeter中打开使用.因此宏哥在这里介绍一下Badboy这款工具,本来打算不做 ...
- P2943 [USACO09MAR]Cleaning Up G
一句话题意:将一个数列分成若干段,每段的不和谐度为该段内不同数字数量的平方,求不和谐度之和的最小值. 令 \(f_i\) 表示前 \(i\) 个数的最小答案,很容易就能写出暴力转移方程:\(f_i=\ ...
- Ajax原理与图解
Ajax原理 Ajax 的全称是Asynchronous JavaScript and XML. Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后 ...