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. iOS-runtime-根据协议名调某一个类有与协议里面放的相同的方法

    // // ViewController.m // ObserverTrampoline // // Created by Rob Napier on 9/7/11. // Copyright (c) ...

  2. HDU——2612Find a way(多起点多终点BFS)

    Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. BZOJ1924 [Sdoi2010]所驼门王的宝藏 【建图 + tarjan】

    题目 输入格式 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室,类型为 Ti.Ti ...

  4. 强大!不懂html也来学网抓(xmlhttp/winhttp+fiddler)

    http://club.excelhome.net/thread-1159783-1-1.html 学习html强力推荐此网站:http://www.w3school.com.cn/ ,绝对权威 交流 ...

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

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

  6. 球形空间产生器 BZOJ 1013

    球形空间产生器 [问题描述] 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便 ...

  7. Highcharts 动态制作3D柱状图

    学习参考菜鸟网站:http://www.runoob.com/highcharts/highcharts-tutorial.html 我是通过后端返回设备数据,进行前端出图,效果如下: 代码如下: d ...

  8. luogu P2085 最小函数值

    题目描述 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个 ...

  9. Spring 详解(一)------- AOP前序

    目录 1. AOP 简介 2. 示例需求 3. 解决方法一:使用静态代理 4. 解决方法二:使用动态代理 1. AOP 简介 ​ AOP(Aspect Oriented Programming),通常 ...

  10. 33.Search in sorted Array

    /* * 33.Search in sorted Array * 2016-4-19 by Mingyang * 我自己写的代码,开始没有考虑[3,1]取1得情况,所以现在需要额外的加一个部分来 * ...