题目链接

数据范围在这:https://lydsy.com/JudgeOnline/wttl/thread.php?tid=613, 另外是\(n\leq3\times10^5\)。

用\(t_i\)表示加工时间的前缀和,\(s_i\)表示费用系数\(F_i\)的前缀和。

\(f_i\)表示以\(i\)作为某一组的最小花费。因为每次分组都会对后面所有任务产生影响,所以都乘

费用系数\(F_i\)就好了。所以:$$f_i=\min{f_j+(t_i-t_j+S)*(s_n-s_j)}$$

拆开,就能写成直线形式了:\(f_i+t_is_j=f_j+t_js_j-Ss_j-s_nt_j+Ss_n+t_is_n\)。

因为斜率\(t_i\)不单调,所以不能用单调队列弹出队首来维护。但是费用系数是正的,即横坐标\(s_j\)是单增的,所以可以直接用单调栈维护一个下凸壳,每次查询时在上面二分合适的斜率。

弹栈的时候为什么要写>=而>不行啊。。同问。。

//11172kb	1092ms(怎么一不小心就rank1了...)
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define MAXIN 1000000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=3e5+5;//数据范围是3e5-- int n,S,t[N],s[N];
LL f[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Node
{
int id,x; LL y;
}sk[N]; inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
inline LL Calc(int i,int j)
{
return f[j]+1ll*(t[i]-t[j]+S)*(s[n]-s[j]);
} int main()
{
n=read(),S=read();
for(int i=1; i<=n; ++i) t[i]=t[i-1]+read(),s[i]=s[i-1]+read();
for(int i=1,top=0; i<=n; ++i)
{
int l=1,r=top,res=0;//l=1!
while(l<=r)
{
int mid=l+r>>1;
if(sk[mid].y-sk[mid-1].y<1ll*t[i]*(sk[mid].x-sk[mid-1].x)) res=mid, l=mid+1;
else r=mid-1;
}
f[i]=Calc(i,sk[res].id);
Node tmp=(Node){i,s[i],f[i]+1ll*t[i]*s[i]-1ll*S*s[i]-1ll*s[n]*t[i]};
while(top && 1ll*(sk[top].y-sk[top-1].y)*(tmp.x-sk[top].x)>=1ll*(tmp.y-sk[top].y)*(sk[top].x-sk[top-1].x)) --top;
sk[++top]=tmp;
}
printf("%lld\n",f[n]); return 0;
}

BZOJ.2726.[SDOI2012]任务安排(DP 斜率优化)的更多相关文章

  1. BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )

    考虑每批任务对后面任务都有贡献, dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N)  F, T均为后缀和. 与j有关 ...

  2. bzoj 2726 [SDOI2012]任务安排(斜率DP+CDQ分治)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2726 [题意] 将n个任务划分成若干个块,每一组Mi任务花费代价(T+sigma{ t ...

  3. BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分

    BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这 ...

  4. BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]

    2726: [SDOI2012]任务安排 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 868  Solved: 236[Submit][Status ...

  5. BZOJ 3675: [Apio2014]序列分割( dp + 斜率优化 )

    WA了一版... 切点确定的话, 顺序是不会影响结果的..所以可以dp dp(i, k) = max(dp(j, k-1) + (sumn - sumi) * (sumi - sumj)) 然后斜率优 ...

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

    dp(v) = min(dp(p)+cost(p,v))+C(v) 设sum(v) = ∑pi(1≤i≤v), cnt(v) = ∑pi*xi(1≤i≤v), 则cost(p,v) = x(v)*(s ...

  7. [SDOI2012]任务安排 BZOJ2726 斜率优化+二分查找

    网上的题解...状态就没有一个和我一样的...这让我有些无从下手... 分析: 我们考虑,正常的斜率优化满足x(i)单调递增,k(i)单调递增,那么我们就可以只用维护一个单调队列满足对于当前的x(i) ...

  8. BZOJ2726 [SDOI2012]任务安排 【斜率优化 + cdq分治】

    题目 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i ...

  9. bzoj 2726: [SDOI2012]任务安排

    Description 机 器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的 若干任务.从时刻0开始,这 ...

随机推荐

  1. HTML&javaSkcript&CSS&jQuery&ajax-Css

    CSS 1 .eg <head> <style> body{ background-color:#d0e4fe;} h1{ color:orange; text-alin:ce ...

  2. MySQL基于ROW格式的数据恢复

    大家都知道MySQL Binlog 有三种格式,分别是Statement.Row.Mixd.Statement记录了用户执行的原始SQL,而Row则是记录了行的修改情况,在MySQL 5.6以上的版本 ...

  3. easyui实现背景图片半透明状态,悬浮在大背景之上

    首先是查找素材,使用AI将所需要的图案画出来,切记将图案的背景设置为所需要的透明状态.项目使用的是easyui架构 为啥加两个背景图呢,因为这样的布局最开始是给一个矩形框加上的背景图片,若是还使用矩形 ...

  4. ajax-简单参数方法实现阴影效果

    注: 简单参数 (按照参数的数量和位置传递参数) 使用时按照位置.数量传递 shadow.js函数 //简单参数实现方式/** slices:阴影* opacity:透明度* zIndex:层级* * ...

  5. 论文阅读笔记五:U-Net: Convolutional Networks for Biomedical Image Segmentation(CVPR2015)

    前面介绍了两个文本检测的网络,分别为RRCNN和CTPN,接下来鄙人会介绍语义分割的一些经典网络,同样也是论文+代码实现的过程,这里记录一下自己学到的东西,首先从论文下手吧. 英文论文原文地址:htt ...

  6. servlet获取多个同名参数

    String[] item = request.getParameterValues("参数名");

  7. 20165206 2017-2018-2 《Java程序设计》第6周学习总结

    20165206 2017-2018-2 <Java程序设计>第6周学习总结 教材学习内容总结 String类:可以被直接使用,不可以有子类. String对象:可以使用String类声明 ...

  8. Vue自定义class覆盖第三方组件原有样式

    一个vue文件可以写多个<style></style>, 如果在style加上socped代表本组件的样式,不污染全局. 如果需要覆盖第三方组件样式,则不能加scoped,因此 ...

  9. webpack学习笔记--提取公共代码

    为什么需要提取公共代码 大型网站通常会由多个页面组成,每个页面都是一个独立的单页应用. 但由于所有页面都采用同样的技术栈,以及使用同一套样式代码,这导致这些页面之间有很多相同的代码. 如果每个页面的代 ...

  10. rimraf node_modules 快速删除

     npm install -g rimraf   // 先进行全局安装 rimraf node_modules   // 进行删除   -------------------------------- ...