bzoj 2726 任务安排
题目大意:
机器上有N个需要处理的任务,它们构成了一个序列 把这些任务分成若干批
从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti
在每批任务开始前,机器需要启动时间S,而完成这批任务所需的时间是各个任务需要时间的总和
注意,同一批任务将在同一时刻完成 每个任务的费用是它的完成时刻乘以一个费用系数Fi
请确定一个分组方案,使得总费用最小
思路:
设dp数组表示前i个的最小花费 为了方便统计 顺便加上对后面的影响
dp i = dpj +(sumtime i - sumtime j + s) * (sumcost n -sumcost j)
拆开之后斜率优化
注意到时间有可能是负的 因此斜率不单调 需要二分
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#define inf 2139062143
#define ll long long
#define MAXN 1001000
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
ll st[MAXN],sc[MAXN],f[MAXN];
int n,s,tim,hd,tl,q[MAXN];
ll Y(int i) {return f[i]-sc[n]*st[i]+sc[i]*st[i]-sc[i]*tim;}
int main()
{
n=read(),tim=read();
for(int i=;i<=n;i++) st[i]=st[i-]+read(),sc[i]=sc[i-]+read();
for(int i=;i<=n;i++)
{
int l=,r=tl-,res=tl,j;
while(l<=r)
{
int mid=(l+r)>>;
if(1ll*(sc[q[mid+]]-sc[q[mid]])*st[i]<=Y(q[mid+])-Y(q[mid])) res=mid,r=mid-;
else l=mid+;
}
j=q[res],f[i]=f[j]+(sc[n]-sc[j])*(st[i]-st[j]+tim);
while(hd<tl&&1ll*(Y(q[tl])-Y(q[tl-]))*(sc[i]-sc[q[tl]])>=(Y(i)-Y(q[tl]))*(sc[q[tl]]-sc[q[tl-]])) tl--;
q[++tl]=i;
}
printf("%lld\n",f[n]);
}
bzoj 2726 任务安排的更多相关文章
- bzoj 2726 任务安排(3)/loj 10184-10186 斜率优化
任务安排1 #include<bits/stdc++.h> #define int long long using namespace std; ; int n,s,t[N],c[N],f ...
- [bzoj 2726] 任务安排 (斜率优化 线性dp)
3月14日第三题!!!(虽然是15号发的qwq) Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3-N.这N个任务被分成若干批 ...
- bzoj 2726 任务安排 斜率优化DP
这个题目中 斜率优化DP相当于存在一个 y = kx + z 然后给定 n 个对点 (x,y) 然后给你一个k, 要求你维护出这个z最小是多少. 那么对于给定的点来说 我们可以维护出一个下凸壳,因为 ...
- BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )
考虑每批任务对后面任务都有贡献, dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N) F, T均为后缀和. 与j有关 ...
- BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]
2726: [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 868 Solved: 236[Submit][Status ...
- bzoj 2726 [SDOI2012]任务安排(斜率DP+CDQ分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2726 [题意] 将n个任务划分成若干个块,每一组Mi任务花费代价(T+sigma{ t ...
- Bzoj 2726 SDOI 任务安排
Memory Limit: 131072KB 64bit IO Format: %lld & %llu Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务 ...
- bzoj 2726: [SDOI2012]任务安排【cdq+斜率优化】
cdq复健.jpg 首先列个n方递推,设sf是f的前缀和,st是t的前缀和: \[ f[i]=min(f[j]+s*(sf[n]-sf[j])+st[i]*(sf[i]-sf[j])) \] 然后移项 ...
- bzoj 2726: [SDOI2012]任务安排
Description 机 器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的 若干任务.从时刻0开始,这 ...
随机推荐
- 洛谷P1077 摆花
题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...
- 【01背包变形】Robberies HDU 2955
http://acm.hdu.edu.cn/showproblem.php?pid=2955 [题意] 有一个强盗要去几个银行偷盗,他既想多抢点钱,又想尽量不被抓到.已知各个银行 的金钱数和被抓的概率 ...
- Linux 端口开放
Linux(CentOS): 系统缺省值为32768-61000. 修改方法: 在/etc/sysctl.conf中,增加以下配置:(开放20000-50000为完成端口) net.ipv4.ip_l ...
- HDU 6396 贪心+优先队列+读入挂
Swordsman Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- hdu - 5128 The E-pang Palace(枚举+计算几何)
http://acm.hdu.edu.cn/showproblem.php?pid=5128 给出n个点,求n个点组成两个矩形的最大面积. 矩形必须平行x轴,并且不能相交,但是小矩形在大矩形内部是可以 ...
- 最近公共祖先(Least Common Ancestors)
题意: 给定一棵有根树T,给出若干个查询lca(u, v)(通常查询数量较大),每次求树T中两个顶点u和v的最近公共祖先,即找一个节点,同时是u和v的祖先,并且深度尽可能大(尽可能远离树根).通常有以 ...
- Error Code: 2006 - MySQL 鏈嶅姟鍣ㄥ凡绂荤嚎
将sql文件导入到mysql时候,就一直报这个错误. 我试过网上各种方法都行不通. 最后将以下一句运行了一下就能够了,并且没有重新启动mysql. SET GLOBAL max_allowed_pac ...
- 运行计划中cost计算方法
概念: blevel:二元高度=索引高度-1 clustering_factor:集群因子,通过索引扫面得出的要查询table的blocks数量,clustering_factor接近table的bl ...
- HDU 5089 Assignment(rmq+二分 或 单调队列)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- Java编程50题
[程序1] 题目:古典问题:有一对兔子.从出生后第3个月起每一个月都生一对兔子,小兔子长到第三个月后每一个月又生一对兔子,假如兔子都不死.问每一个月的兔子总数为多少? //这是一个菲波拉契 ...