[SDOI2012] 任务安排 题解
有感而发,遂书。
其实和sze聊了很久,但他还是退役了。恐怕他是本届里学oi时间最长的一个人吧,从小学五年级开始。我也是因为他,才开始学oi的。他因为学校的压力,不得不放弃。或许是没什么天赋。学了4年也才一个pj2=,我也才学了半年多,就是省一。只是感叹罢了。在提高机房里,我是最小的。在普及机房里我是最大的。事实上,我又何尝不羡慕呢,也许,我再早一点,只要早半年,我就可以初三进省队。或许,这是对我挥霍初二一年时光的惩罚吧。
时光荏苒,你我不再是少年。
题意分析
我们很简单的有一个dp的造作,事实上是可以过掉第一题的
定义 \(f_i\)表示完成\(1\)至\(i\)任务所需的最少花费。
所求 \(f_n\)即为所求
为了书写方便。我们做一个前缀和 定义 c,t就像题面所说的
dp转移方程
\[
f[i]=min_{0 \le j < i}\{ f[j]+s*(c[n]-c[j])+t[i]*(c[i]-c[j])\}
\]
轻轻一跃跳入坑中
我们这里用了一种想法,就是把后面任务的启动时间算到这一次,这样就不用统计他的记录分了几批任务的状态。
运用这个dp的转移是\(O(n^2)\)的,可以过掉第一题,但是第二题还差优化。
观察了第二题。由于是一维dp自然想到了决策的单调性。推了一下大概是满足的。于是我想到了斜率优化。。。。从此跳入了坑
我们把上面的dp方程做展开有:
\[
f[j]=(t[i]+s)*c[j]+(-t[i]*c[i]+f[i]-s*c[n])
\]
我们知道,如果能斜率优化dp方程必定能变为\(y=kx+b\) 的形式
其中y=只关于j的函数,x=只关于j的函数,k=只关于i的函数,b=只关于i的函数,k和x不严格单调递增。
我们的每个点就为\((c[j],f[j])\),此时,这不就是斜率优化的板子吗?开心的打上去。0pts滚粗
于是我们观察数据范围 \(|t_i| \le 2^8\)..有负的,所以我们不能维护单调队列。但是dp的决策是单调的!
那就再跳出来
那就用一个单调栈。
我们的单调队列维护了一个下图

然而k不是单增的,显然的,上凸点依然不可能成为决策点。所以我们要维护的就是一个下凸包就如下图:

再找最优决策点是可以二分来找
可以用单调栈来维护
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
typedef long long ll;
typedef double db;
const int Maxn=3*1e5+11;
ll n,s,c[Maxn],t[Maxn],q[Maxn],tail,head;
ll f[Maxn];
ll read(){
ll x=0;
bool f=0;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
x=(x<<1)+(x<<3)+(ch-'0');
ch=getchar();
}
if(f) return -x;
return x;
}
ll search(ll head,ll tail,ll k){
if(head==tail) return q[head];
ll ans;
while(head<=tail){
ll mid=(head+tail)>>1;
if((f[q[mid+1]]-f[q[mid]])>(ll)k*(c[q[mid+1]]-c[q[mid]])){
// 维护下凸壳去第一个 slope(mid,mid+1)>k,因为下凸壳k单增
tail=mid-1;
ans=mid;
}
else head=mid+1;
}
return q[ans];
}
int main(){
freopen("SDOItask.in","r",stdin);
n=read();s=read();
for(int i=1;i<=n;i++) t[i]=t[i-1]+read(),c[i]=c[i-1]+read();
tail=1;head=1;
for(int i=1;i<=n;i++){
ll p=search(head,tail,s+t[i]);
f[i]=f[p]+t[i]*(c[i]-c[p])+s*(c[n]-c[p]);
while(head<tail&&(f[i]-f[q[tail]])*(ll)(c[q[tail]]-c[q[tail-1]])<=(f[q[tail]]-f[q[tail-1]])*(ll)(c[i]-c[q[tail]])) tail--;
q[++tail]=i;
}
printf("%lld",f[n]);
return 0;
}
嵬
讲真的,我不会线段树。。。
[SDOI2012] 任务安排 题解的更多相关文章
- 【BZOJ2726】[SDOI2012]任务安排 斜率优化+cdq分治
[BZOJ2726][SDOI2012]任务安排 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若 ...
- [BZOJ2726][SDOI2012]任务安排(DP+凸壳二分)
2726: [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1580 Solved: 466[Submit][Statu ...
- BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )
考虑每批任务对后面任务都有贡献, dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N) F, T均为后缀和. 与j有关 ...
- [bzoj P2726] [SDOI2012]任务安排
[bzoj P2726] [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1204 Solved: 349[Submit] ...
- BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]
2726: [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 868 Solved: 236[Submit][Status ...
- BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分
BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这 ...
- 笔记-[SDOI2012]任务安排
笔记-[SDOI2012]任务安排 [SDOI2012]任务安排 \(f_i\) 表示分配到第 \(i\) 个任务的最小费用. 令 \(st_i=\sum_{h=1}^iT_h\),\(sc_i=\s ...
- [SDOI2012]任务安排 BZOJ2726 斜率优化+二分查找
网上的题解...状态就没有一个和我一样的...这让我有些无从下手... 分析: 我们考虑,正常的斜率优化满足x(i)单调递增,k(i)单调递增,那么我们就可以只用维护一个单调队列满足对于当前的x(i) ...
- BZOJ 2726 [SDOI2012] 任务安排 - 斜率优化dp
题解 转移方程与我的上一篇题解一样 : $S\times sumC_j + F_j = sumT_i \times sumC_j + F_i - S \times sumC_N$. 分离成:$S\t ...
随机推荐
- 自己动手开发手机APP控制西门子200smart 教程(原创干货)
自己动手开发手机APP控制西门子200smart 教程(原创干货) 自己动手开发手机APP控制西门子200smart 教程(原创干货) 2020-02-09 19:06:45 自己动手开发手机AP ...
- 【动手学pytorch】线性回归
代码及解释 错题整理
- Go语言中的单例模式(翻译)
在过去的几年中,Go语言的发展是惊人的,并且吸引了很多由其他语言(Python.PHP.Ruby)转向Go语言的跨语言学习者. Go语言太容易实现并发了,以至于它在很多地方被不正确的使用了. Go语言 ...
- HDU_4570_区间dp
http://acm.hdu.edu.cn/showproblem.php?pid=4570 连题目都看不懂,直接找了题解,copy了过来= =. 一个长度为n的数列,将其分成若干段(每一段的长度要& ...
- codeforces 540D Bad Luck Island (概率DP)
题意:会出石头.剪刀.布的人分别有r,s,p个,他们相互碰到的概率相同,输的人死掉,问最终活下去的人是三种类型的概率 设状态dp(i,j,k)为还有i个石头,j个剪刀,k个布时的概率,dp(r,s,p ...
- python之reload用法
一.python2和python3的区别 python2中可以直接使用reload().python3中需要从库中导入,有两种方法: >>> from imp import relo ...
- 我的一个配置redux(实现一次存储与调用方法)之旅
前言 : 今天呢,就配置一下redux,redux的重要性呢,就叭叭叭一大堆,什么也没有带着配置一次来的重要,因为许多涉及到的属性和方法,用法是活的,但格式是需要记忆的. 过程中不要嫌我唠叨,有的地方 ...
- Asp.net core下利用EF core实现从数据实现多租户(3): 按Schema分离 附加:EF Migration 操作
前言 前段时间写了EF core实现多租户的文章,实现了根据数据库,数据表进行多租户数据隔离. 今天开始写按照Schema分离的文章. 其实还有一种,是通过在数据表内添加一个字段做多租户的,但是这种模 ...
- sys.stdout.write和print和sys.stdout.flush
1. 先看下官方文档 """ sys.stdout.write(string) Write string to stream. Returns the number of ...
- Linux中awk抽取包含某字段的整行日志
命令示例:awk '{if($0~"listAuths") print}' xxx.log 解释说明:抽取xxx.log整个日志文件中,包含“listAuths”的行,打印输出