【BZOJ2726】[SDOI2012]任务安排

Description

机器上有N个需要处理的任务,它们构成了一个序列。这些任务被标号为1到N,因此序列的排列为1,2,3...N。这N个任务被分成若干批,每批包含相邻的若干任务。从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti。在每批任务开始前,机器需要启动时间S,而完成这批任务所需的时间是各个任务需要时间的总和。注意,同一批任务将在同一时刻完成。每个任务的费用是它的完成时刻乘以一个费用系数Fi。请确定一个分组方案,使得总费用最小。

Input

第一行两个整数,N,S。
接下来N行每行两个整数,Ti,Fi。

Output

一个整数,为所求的答案。

Sample Input

5 1
1 3
3 2
4 3
2 3
1 4

Sample Output

153

题解:用f[i]表示做完前i个任务的最小费用,但是做完当前任务的时间对后面的任务也会造成影响,所以我们提前应计算费用,不难列出方程:

设st表示T的前缀和,sf表示F的前缀和,所以有:

$f[i]=\min \{ f[j]+(st[i]-st[j]+S)*(sf[n]-sf[j])\}$

移个项显然就变成了斜率优化的形式。不过坑的地方是,T可能是负数,所以斜率不是单调的,所以用cdq分治即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=300010;
typedef long long ll;
typedef long double ld;
int n;
ll S;
struct node
{
int x,org,k;
ll y,f;
}s[maxn],p[maxn];
int q[maxn];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
bool cmpk(const node &a,const node &b)
{
return a.k>b.k;
}
bool cmpo(const node &a,const node &b)
{
return a.org<b.org;
}
inline ld slope(int a,int b)
{
if(s[a].x==s[b].x) return (s[b].y>=s[a].y)?(1e20):(-1e20);
else return ld(s[b].y-s[a].y)/(s[b].x-s[a].x);
}
void solve(int l,int r)
{
if(l==r)
{
s[l].y=(ll)s[l].x*(s[l].k-S)-s[l].f;
return ;
}
register int mid=(l+r)>>1,i,h1=l,h2=mid+1;
for(i=l;i<=r;i++)
{
if(s[i].org<=mid) p[h1++]=s[i];
else p[h2++]=s[i];
}
for(i=l;i<=r;i++) s[i]=p[i];
solve(l,mid);
register int h=1,t=0;
for(i=l;i<=mid;i++)
{
while(h<t&&slope(q[t],i)>=slope(q[t-1],q[t])) t--;
q[++t]=i;
}
for(i=mid+1;i<=r;i++)
{
while(h<t&&slope(q[h],q[h+1])>=s[i].k) h++;
s[i].f=min(s[i].f,s[q[h]].f+s[q[h]].x*(s[i].k-s[q[h]].k+S));
}
solve(mid+1,r);
h1=l,h2=mid+1;
for(i=l;i<=r;i++)
{
if(h1<=mid&&(h2>r||s[h1].x<s[h2].x)) p[i]=s[h1++];
else p[i]=s[h2++];
}
for(i=l;i<=r;i++) s[i]=p[i];
}
int main()
{
n=rd(),S=rd();
int i;
for(i=1;i<=n;i++) s[i].k=s[i-1].k+rd(),s[i-1].x=rd(),s[i].org=i;
for(i=n-1;i>=0;i--) s[i].x+=s[i+1].x;
for(i=1;i<=n;i++) s[i].f=s[0].x*(s[i].k+S);
sort(s+1,s+n+1,cmpk);
solve(1,n);
sort(s+1,s+n+1,cmpo);
printf("%lld",s[n].f);
return 0;
}

【BZOJ2726】[SDOI2012]任务安排 斜率优化+cdq分治的更多相关文章

  1. [bzoj2726][SDOI2012]任务安排 ——斜率优化,动态规划,二分,代价提前计算

    题解 本题的状态很容易设计: f[i] 为到第i个物件的最小代价. 但是方程不容易设计,因为有"后效性" 有两种方法解决: 1)倒过来设计动态规划,典型的,可以设计这样的方程: d ...

  2. BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治

    BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治 Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM) ...

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

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

  4. [Noi2014]购票 BZOJ3672 点分治+斜率优化+CDQ分治

    Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的 ...

  5. 【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 3396  Solved: 1434[Submit][Sta ...

  6. 洛谷.4655.[CEOI2017]Building Bridges(DP 斜率优化 CDQ分治)

    LOJ 洛谷 \(f_i=s_{i-1}+h_i^2+\min\{f_j-s_j+h_j^2-2h_i2h_j\}\),显然可以斜率优化. \(f_i-s_{i-1}-h_i^2+2h_ih_j=f_ ...

  7. BZOJ3963 WF2011MachineWorks(动态规划+斜率优化+cdq分治)

    按卖出时间排序后,设f[i]为买下第i台机器后的当前最大收益,则显然有f[i]=max{f[j]+gj*(di-dj-1)+rj-pi},且若此值<0,应设为-inf以表示无法购买第i台机器. ...

  8. bzoj1492/luogu4027 货币兑换 (斜率优化+cdq分治)

    设f[i]是第i天能获得的最大钱数,那么 f[i]=max{在第j天用f[j]的钱买,然后在第i天卖得到的钱,f[i-1]} 然后解一解方程什么的,设$x[j]=\frac{F[j]}{A[j]*Ra ...

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

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

随机推荐

  1. 拒绝蛋疼,javascript调试技巧

    chrome的调试技巧网上很多介绍了,这里提两个个人觉得比较有用的: 1.console.log 优点:可以输出json对象,而非字符串,这是 alert() 做不到的 缺点:记得要删除,否则在低版本 ...

  2. Spark in meituan http://tech.meituan.com/spark-in-meituan.html

    Spark在美团的实践 忽略元数据末尾 回到原数据开始处 引言:Spark美团系列终于凑成三部曲了,Spark很强大应用很广泛, 文中Spark交互式开发平台和作业ETL模板的设计都很有启发借鉴意义. ...

  3. 会话过程保存数据对象cookie和session

    1 cookie是以键值对保存在浏览器端,服务器端可以创建.接收.发送 cookie 信息. request可以接收 cookie, response 可以发送 cookie. 1)cookie 可以 ...

  4. centos 无法ping内网 Destination Host Unreachable

    centos 突然无法ping内网了. 本来是一直是好好的. 在这之前,当前服务器(centos 192.168.1.30)大量的在操作内网192.168.1.20服务器的数据库.. 会不会是流量大了 ...

  5. ubuntu16.04安装jekyll 3.3.1

    本次安装的ekyll为最新的3.3.1版本. 一.预备工作,因位jekyll需要很多软件的支持,所以准备工作要做足. Ruby (including development headers, v1.9 ...

  6. mysql 开启慢查询 如何打开mysql的慢查询日志记录

    mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句,那如何打开mysql的慢查询日志记录呢,接下来将详细为您介绍 原文出自:http://www.jbxue ...

  7. DB2检测表字段改动的方法(不用触发器)

    ALTER TABLE TEST ADD COLUMN RTS TIMESTAMP NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CH ...

  8. MySQL中的Multi-Range Read优化

    MySQL 5.6开始支持Multi-Range Read(MRR)优化.目的是味儿减少磁盘的随机访问,并且将随机访问转化为较为顺序的数据访问,这对IO-bound类型的SQL查询语句可带来性能极大的 ...

  9. python 快速获取文件类型

  10. Bootstrap学习笔记(5)--实现Bootstrap导航条可点击和鼠标悬停显示下拉菜单

    实现Bootstrap导航条可点击和鼠标悬停显示下拉菜单 微笑的鱼 2014-01-03 Bootstrap 5,281 次围观 11条评论 使用Bootstrap导航条组件时,如果你的导航条带有下拉 ...