Batch Scheduling



$ solution: $

这应该是斜率优化中最经典的一道题目,虽然之前已经写过一道 $ catstransport $ 的题解了,但还是来回顾一下吧,这道题其实较那一道还是难一些,只不过 $ catstransport $ 很难找到最好码代码的式子。

首先单调队列优化是用来优化一些转移方程里面存在只与枚举的决策或当前状态中的单独某一个存在关系的项的动态规划,而我们的斜率优化是用来优化一些转移方程里面存在与枚举的决策和当前状态都有直接关系的项的动态规划的(当然斜率优化还需要这个项是随着枚举呈单调性的)。

我们先来分析一下这道题目,要将某些任务按顺序分批次处理,同一批次共用一个时间权值,每批次前要花时间预处理。因为它需要按时间顺序处理,所以我们可以想到线性DP,而且子任务的最优性是可以推广到全局的。可能有人会说最后一个限制会有后效性,但其实它很容易消去,我们只要在每一个批次转移时减去后面所有的任务会因为这个预处理的拖延而产生的额外花费即可。这样我们可以列出转移方程:

因为题目没说一定要将这些任务划分成多少批次,所以我们可以直接设 $ F[i] $ 表示将前 $ i $ 分任务划分完毕之后的最少花费,然后我们预处理处时间的前缀和 $ T[i] $ 还有费用的前缀和 $ S[i] $ 然后转移可以这样:

$ F[i]=^{min}_{0\leq k<j}{F[j]+S\times (S[N]-S[j])+T[i]\times (S[i]-S[j]) } $

这个式子是 $ n^2 $ 的复杂度,数据范围再次对我们说不,我们还要在优化:将与 $ j $ 无关的数提取出来,并去掉括号:

$ F[i]=^{min}_{0\leq k<j}{F[j]+S\times S[N]-S\times S[j]+T[i]\times S[i]-T[i]\times S[j] } $

$ F[i]=^{min}_{0\leq k<j}{F[j]-S\times S[j]-T[i]\times S[j] }+S\times S[N]+T[i]\times S[i] $

然后我们发现 $ max $ 函数里有与枚举的决策 $ j $ 和当前状态 $ i $ 都有直接关系的项 ( $ T[i]\times S[j] $ )而且 $ T[i] $ 是单调递增的,于是我们就可以用斜率优化了。将 $ S[j] $ 最为 $ x $ 轴,将 $ F[i]+S\times S[j] $ 作为 $ y $ 轴,然后每一个决策集合(我们所有的可以用的 $ j $ 都变成一个点),我们知道 $ T[i] $ (斜率)是单调递增的,所以只要这些点的的下凸壳即可!



$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set> #define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int using namespace std; int n,s,sr=1;
ll v[300005];
ll t[300005];
ll f[300005];
ll q[300005]; inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar())) if(ch=='-')sign=1;
while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();
return sign?-res:res;
} inline int get(int k){
if(sr<2)return q[sr];
rg l=1,r=sr-1,mid;
while(l<=r){
mid=(l+r)>>1;
if(f[q[mid+1]]-f[q[mid]]<k*(v[q[mid+1]]-v[q[mid]]))l=mid+1;
else r=mid-1;
}return q[l];
} int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr(); s=qr();
for(rg i=1;i<=n;++i){
t[i]=t[i-1]+qr();
v[i]=v[i-1]+qr();
} q[1]=0;
for(rg i=1;i<=n;++i){
rg j=get(s+t[i]);
f[i]=f[j]-(s+t[i])*v[j]+v[i]*t[i]+s*v[n];
while(sr>1&&(f[i]-f[q[sr]])*(v[q[sr]]-v[q[sr-1]])<=(f[q[sr]]-f[q[sr-1]])*(v[i]-v[q[sr]])) --sr;
q[++sr]=i;
}printf("%lld\n",f[n]);
return 0;
}

poj 1180 Batch Scheduling (斜率优化)的更多相关文章

  1. POJ 1180 - Batch Scheduling - [斜率DP]

    题目链接:http://poj.org/problem?id=1180 Description There is a sequence of N jobs to be processed on one ...

  2. POJ 1180 Batch Scheduling(斜率优化DP)

    [题目链接] http://poj.org/problem?id=1180 [题目大意] N个任务排成一个序列在一台机器上等待完成(顺序不得改变), 这N个任务被分成若干批,每批包含相邻的若干任务. ...

  3. poj 1180:Batch Scheduling【斜率优化dp】

    我会斜率优化了!这篇讲的超级棒https://blog.csdn.net/shiyongyang/article/details/78299894?readlog 首先列个n方递推,设sf是f的前缀和 ...

  4. POJ 1180 Batch Scheduling

    BTW: 刚在图书馆借了本算法艺术与信息学竞赛. 我多次有买这本书的冲动, 但每次在试看之后就放弃了, 倒不是因为书太难, 而是写的实在是太差. 大家对这本书的评价很高, 我觉得多是因为书的内容, 而 ...

  5. POJ1180 Batch Scheduling -斜率优化DP

    题解 将费用提前计算可以得到状态转移方程: $F_i = \min(F_j + sumT_i * (sumC_i - sumC_j) + S \times (sumC_N - sumC_j)$ 把方程 ...

  6. POJ 1180 Batch Scheduling (dp,双端队列)

    #include <iostream> using namespace std; + ; int S, N; int T[MAX_N], F[MAX_N]; int sum_F[MAX_N ...

  7. P2365 任务安排 / [FJOI2019]batch(斜率优化dp)

    P2365 任务安排 batch:$n<=10000$ 斜率优化入门题 $n^{3}$的dp轻松写出 但是枚举这个分成多少段很不方便 我们利用费用提前的思想,提前把这个烦人的$S$在后面的贡献先 ...

  8. POJ 3709 K-Anonymous Sequence - 斜率优化dp

    描述 给定一个数列 $a$, 分成若干段,每段至少有$k$个数, 将每段中的数减少至所有数都相同, 求最小的变化量 题解 易得到状态转移方程 $F_i = \min(F_j  + sum_i - su ...

  9. 【转】斜率优化DP和四边形不等式优化DP整理

    (自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...

随机推荐

  1. Android点击两次返回退出程序

    代码改变世界 Android点击两次返回退出程序 private long mExitTime; public boolean onKeyDown(int keyCode, KeyEvent even ...

  2. PAT天梯赛练习题——L3-004. 肿瘤诊断(三维连通块并查集)

    L3-004. 肿瘤诊断 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环.给定病灶 ...

  3. [UOJ#127][BZOJ4195][NOI2015]程序自动分析

    [UOJ#127][BZOJ4195][NOI2015]程序自动分析 试题描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2, ...

  4. 刷题总结——竞赛得分(ssoj)

    题目: 题目描述 ZZH 在经历了无数次学科竞赛的失败以后,得到了一个真理:做一题就要对一题!但是要完全正确地做对一题是要花很多时间(包括调试时间),而竞赛的时间有限.所以开始做题之前最好先认真审题, ...

  5. cf299C Weird Game

    Weird Game Yaroslav, Andrey and Roman can play cubes for hours and hours. But the game is for three, ...

  6. GFS, HDFS, Blob File System架构对比

    分布式文件系统很多,包括GFS,HDFS,淘宝开源的TFS,Tencent用于相册存储的TFS (Tencent FS,为了便于区别,后续称为QFS),以及Facebook Haystack.其中,T ...

  7. polya burnside 专题

    polya题目:uva 11077 Find the Permutationsuva 10294 Arif in DhakaLA 3641 Leonardo's Notebookuva 11077 F ...

  8. 等价表达式(codevs 1107 答案错误)

    题目描述 Description 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  9. 更改App名称

    To change the installed application name, in Xcode: 1. Select your Target on the left side under Gro ...

  10. WAMP本地环境升级php版本--第二次尝试

    wamp 环境下 php5.6.25 升级php7.1.17 实践 本文参考:https://www.cnblogs.com/hubaohua1588/p/6884146.html来进行操作. 1.从 ...