[BZOJ2726][SDOI2012]任务安排(DP+凸壳二分)
2726: [SDOI2012]任务安排
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1580 Solved: 466
[Submit][Status][Discuss]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 4Sample Output
153HINT
Source
复习了无数次CDQ分治和斜率优化,CDQ分治真的是博大精深。
但是,这道题,要个鬼CDQ分治啊!询问斜率不单调又不是插入点横坐标不单调!直接二分找切点不就好了!
说下思路吧,首先$O(n^3)$的DP谁都想得出来,考虑优化,f[i]记录前i个物品的信息。
但是问题来了,时间有后效性,前面的总时间对后面有影响,除非多设一维时间状态,而这样又是$n^3$的了,那么我们干脆就考虑前i个物品的总费用以及这i个物品给后面所有物品带来的费用之和。显然这样是满足无后效性,同时也满足最优子结构的。
设F[i]=f[i]前缀和,T[i]同理,则有DP方程:$dp[i]=min\{dp[j]+(T[i]-T[j]+S)(F[n]-F[j])\}$。这样复杂度就变为$O(n^2)$了。
熟练的选手一眼就知道这是斜率优化的形式,复杂度立刻降为$O(n)$。
但是!看Discuss知道这题的时间可以是负的!于是网上几乎所有的题解立刻全部变为CDQ分治版本,但其实并不需要,因为插入的点的横坐标仍然是单调的所以并不需要动态维护凸壳。询问斜率不单调的话直接二分找直线和凸壳的切点即可。这一点也是这题和货币兑换Cash的一个本质区别。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=;
ll T[N],F[N],f[N];
int n,s,S,st,ed,q[N]; ll Y(int j){ return f[j]-F[n]*T[j]+F[j]*T[j]-F[j]*S; } void dp(){
st=ed=;
rep(i,,n){
int l=,r=ed-,ans=ed;
while (l<=r){
ll mid=(l+r)>>;
if (1ll*(F[q[mid+]]-F[q[mid]])*T[i]<=Y(q[mid+])-Y(q[mid])) ans=mid,r=mid-; else l=mid+;
}
int j=q[ans]; f[i]=f[j]+(F[n]-F[j])*(T[i]-T[j]+S);
while (st<ed && 1ll*(Y(q[ed])-Y(q[ed-]))*(F[i]-F[q[ed]])>=(Y(i)-Y(q[ed]))*(F[q[ed]]-F[q[ed-]])) ed--;
q[++ed]=i;
}
} int main(){
freopen("bzoj2726.in","r",stdin);
freopen("bzoj2726.out","w",stdout);
scanf("%d%d",&n,&S);
rep(i,,n) scanf("%lld%lld",&T[i],&F[i]),T[i]+=T[i-],F[i]+=F[i-];
dp(); printf("%lld\n",f[n]);
return ;
}
[BZOJ2726][SDOI2012]任务安排(DP+凸壳二分)的更多相关文章
- BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分
BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这 ...
- 2018.09.05 bzoj2726: [SDOI2012]任务安排(斜率优化dp+二分)
传送门 跟Ti" role="presentation" style="position: relative;">TiTi为正数的时候差不多. ...
- 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 斜率优化)
题目链接 数据范围在这:https://lydsy.com/JudgeOnline/wttl/thread.php?tid=613, 另外是\(n\leq3\times10^5\). 用\(t_i\) ...
- bzoj2402 陶陶的难题II 分数规划+树剖+线段树维护凸壳+二分
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2402 题解 看上去很像分数规划的模型.于是就二分吧.令 \[ \begin{align*}\f ...
- BZOJ 2726: [SDOI2012]任务安排 斜率优化 + 凸壳二分 + 卡精
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...
- [bzoj2726][SDOI2012]任务安排 ——斜率优化,动态规划,二分,代价提前计算
题解 本题的状态很容易设计: f[i] 为到第i个物件的最小代价. 但是方程不容易设计,因为有"后效性" 有两种方法解决: 1)倒过来设计动态规划,典型的,可以设计这样的方程: d ...
- BZOJ2726 [SDOI2012]任务安排 【斜率优化 + cdq分治】
题目 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i ...
- BZOJ2726: [SDOI2012]任务安排
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2726 倒着做,前面的点对后面的点都是有贡献的. f[i]=min(f[j]+cost[i]*( ...
随机推荐
- 【BZOJ】1710: [Usaco2007 Open]Cheappal 廉价回文
[算法]区间DP [题解]回文问题的套路做法:区间DP. f[i][j]表示区间i~j回文的最小代价,则有f[i][j]=min{①②③}. ①f[i+1][j]+min(a[s[i]],b[s[i] ...
- 使用.net core abp framework
abp是一个有用的框架,包含许多功能,可以用来作为脚手架. 直接在官方网站上输入相应的工程名称,选择对应的版本就会下载对应的版本..net core 版本的可以使用后端框架部分来做api,包含了常用框 ...
- bzoj 3343 分块
因为询问比较少,所以我们可以将n个数分成sqrt(n)个块,每个块用一颗bst存一下,然后对于修改l,r,我们将l,r区间中整块的直接在bst上打一个标签,对于不是整块的我们直接暴力修改,对于询问l, ...
- Collection包结构,与Collections的区别
Collection 1.Collection是集合类的顶级接口: 2.实现接口和类主要有Set.List.LinkedList.ArrayList.Vector.Stack.Set: Collect ...
- nginx源码分析--使用GDB调试(strace、 pstack )
nginx源码分析--使用GDB调试(strace. pstack ) http://blog.csdn.net/scdxmoe/article/details/49070577
- 【Educational Codeforces Round20】
这场edu有点简单…… 所以题目可能也有点奇奇怪怪的. A.随意构造一下,可以发现只有当填满都不行时才可能无解. #include<bits/stdc++.h> using namespa ...
- VI编辑,backspace无法删除解决方法
系统ubuntu 1,sudo apt-get install vim 安装vim 2, sudo vi /etc/vim/vimrc.tiny 修改 set compatible为set noc ...
- [ python ] 类中的一些特殊方法
item系列 __getitem__(self, item) 对象通过 object[key] 触发 __setitem__(self, key, value) 对象通过 object[key] = ...
- SPOJ Two Paths
Description 给定一个无向图,含有一定的路.从中找出两个最长的路径(每条路径有一些相通路组成)这两个路径不能经过公共的点,求何时二路径的乘积最大. 本题给出的无向图是一棵树,每边权值为1. ...
- 10:django 模板语言
Django的模板语言的目的是取得力量和易用性之间的平衡,与其他的模板语言相比,django模板语言显得更简单,更专一, django模板系统由模板,变量,过滤器,标签,注释等主要部分组成 模板 一个 ...