BZOJ_2726_[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个任务完成后最小的代价。
然后把后面的代价提前计算。
设sx[],sy[]分别为x,y的前缀和。
F[i]=F[j]+(m+sx[i]-sx[j])*(sy[n]-sy[j])。设sum=sy[n]。
然后斜率优化:F[i]=-sy[j]*sx[i]  -sx[j]*sum-m*sy[j]+sx[j]*sy[j]  +m*sum+sx[i]*sum
把决策点当成直线,斜率-sy[j]单调减。
于是维护一个上凸壳。
但是每次查询的X(i)=sx[i]不一定单调。
因此不能乱弹队首。每次二分一下当前凸壳上交点离X(i)最近的大于X(i)位置,这个位置最优。
 
代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
#define N 300050
int n,m,xx[N],yy[N],Q[N],l,r;
ll f[N],sx[N],sy[N],sum;
ll K(int j) {
return -sy[j];
}
ll B(int j) {
return f[j]-sx[j]*sum-m*sy[j]+sx[j]*sy[j];
}
ll Y(int i,int j) {
return K(j)*sx[i]+B(j);
}
bool cover(int p1,int p2,int p3) {
// return (K(p1)-K(p3))*(B(p2)-B(p1))>=(K(p1)-K(p2))*(B(p3)-B(p1));
return (K(p2)-K(p3))*(B(p1)-B(p3))<=(B(p3)-B(p2))*(K(p3)-K(p1));
}
bool check(int p1,int p2,int i) {
return B(p1)-B(p2)>=sx[i]*(K(p2)-K(p1));
}
int main() {
scanf("%d%d",&n,&m);
int i,j;
for(i=1;i<=n;i++) {
scanf("%d%d",&xx[i],&yy[i]);
sx[i]=sx[i-1]+xx[i];
sy[i]=sy[i-1]+yy[i];
}
sum=sy[n];
memset(f,0x3f,sizeof(f));
f[0]=0;
/*for(i=1;i<=n;i++) {
for(j=0;j<i;j++) {
f[i]=min(f[i],f[j]+(m+sx[i]-sx[j])*(sum-sy[j]));
}
}*/
r=1;
/*for(i=1;i<=n;i++) {
while(l<r-1&&Y(i,Q[l])>=Y(i,Q[l+1])) l++;
j=Q[l];
printf("%d\n",j);
f[i]=Y(i,j)+m*sum+sx[i]*sum;
while(l<r-1&&cover(Q[r-2],Q[r-1],i)) r--;
Q[r++]=i;
}*/
for(i=1;i<=n;i++) {
int ll=l,rr=r-1;
while(ll<rr) {
int mid=(ll+rr)>>1;
if(check(Q[mid],Q[mid+1],i)) ll=mid+1;
else rr=mid;
}
j=Q[ll];
//printf("%d\n",j);
f[i]=Y(i,j)+m*sum+sx[i]*sum;
while(l<r-1&&cover(Q[r-2],Q[r-1],i)) r--;
Q[r++]=i;
}
printf("%lld\n",f[n]);
}

BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分的更多相关文章

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

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

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

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

  3. 2018.09.05 bzoj2726: [SDOI2012]任务安排(斜率优化dp+二分)

    传送门 跟Ti" role="presentation" style="position: relative;">TiTi为正数的时候差不多. ...

  4. BZOJ.2726.[SDOI2012]任务安排(DP 斜率优化)

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

  5. BZOJ_3675_[Apio2014]序列分割_斜率优化

    BZOJ_3675_[Apio2014]序列分割_斜率优化 Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了 ...

  6. BZOJ_4518_[Sdoi2016]征途_斜率优化

    BZOJ_4518_[Sdoi2016]征途_斜率优化 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到 ...

  7. BZOJ_1713_[Usaco2007 China]The Bovine Accordion and Banjo Orchestra 音乐会_斜率优化

    BZOJ_1713_[Usaco2007 China]The Bovine Accordion and Banjo Orchestra 音乐会_斜率优化 Description Input 第1行输入 ...

  8. BZOJ2726【SDOI2012】任务安排(斜率优化Dp+二分查找)

    由题目条件显然可以得到状态 f[i][j] 表示以 i 为结尾且 i 后作为断点,共做了 j 次分组的最小代价. 因此转移变得很显然:f[i][j]=min{f[k][j-1]+(s×j+sumT[i ...

  9. [BZOJ2726][SDOI2012]任务安排(DP+凸壳二分)

    2726: [SDOI2012]任务安排 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1580  Solved: 466[Submit][Statu ...

随机推荐

  1. python和linux的环境设置/PATH

    一.python的环境设置 1.输出path列表: pi@raspberrypi:~$ pythonPython 3.4.0 (default, Jul 1 2014, 09:37:01) [GCC ...

  2. 大整数类BIGN的设计与实现 C++高精度模板

    首先感谢刘汝佳所著的<算法竞赛入门经典>. 众所周知,C++中储存能力最大的unsigned long long 也是有着一个上限,如果我们想计算非常大的整数时,就不知所措了,所以,我写了 ...

  3. JavaSE的包装类,自动装箱和自动拆箱 ,字符窜转换,toString(),equals(), hashCode()的区别

    一.基本数据类型和包装类 包装类均位于Java.lang包,包装类和基本数据类型的对应关系如下表所示: Primitive-Type   Wrapper-Class        byte       ...

  4. 批量修改WORD表格属性

    有时候需要对word中很多表格的属性进行修改,而word无法批量修改属性,所有这里记录一个宏 Sub TableFormatter() Dim oTbl As Table, i As Integer ...

  5. kafka-0.8.1.1总结

    文件夹 一.         基础篇 1.     开篇说明 2.     概念说明 3.     配置说明 4.     znode分类 5.     kafka协议分类 6.     Kafka线 ...

  6. IOS开发 二维码功能的实现

    原帖地址:http://yul100887.blog.163.com/blog/static/20033613520121020611299/ 如今二维码随处可见,无论是实物商品还是各种礼券都少不了二 ...

  7. C#如何实现挂机锁

    首先在主窗体中设置一个子窗体的实例,然后当点击挂机之后,隐藏当前窗体,同时显示子窗体.   把子窗体的背景窗体设置如下属性(主要是背景随便改成一个图片,然后FormBorderStyle改成None, ...

  8. JAVA程序设计(12.3)---- 监听器0基础应用:五子棋

    1.制作五子棋游戏软件 由于老师已经基本做完了.重做的时候快了非常多--可是还是感觉思维非常混乱-- 哪边先哪边后,哪个方法在哪边好之类的问题 太纠结了-- 先是窗体 内部类:鼠标适配器  窗体的构造 ...

  9. plsql 无需配置客户端连接.

    plsql 无需配置客户端连接. (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.5)(PORT=1521)))(C ...

  10. NAND flash坏区

    计算容量 厂家所说的4G指的是4 000 000 000字节,是按1000进制计算的,而电脑是按照1024进制计算的,所以标称为4G的NAND Flash理论容量是4 000 000 000 / 10 ...