luogu P2365 任务安排(FJOI2019 batch)
FJOI 日常原题 $2333$(似乎还不如 SDOI2012 任务安排 $2333$)
显然考虑 $dp$,这个是经典的把未来的代价先计算的 $dp$,然后才是斜率优化
一开始想状态时一直有一个时间维,然后就没法优化,考虑如何消掉这个时间维
可以发现,时间只和当前处理到的任务编号,和之前启动机器的次数(分的段数)有关
然后就可以设 $f[i][j]$ 表示前 $i$ 个任务,分了 $j$ 段,然后就可以 $O(n^3)$ $dp$ 了(然鹅此时并不能斜率优化...)
考虑怎么优化,发现每次分的时候都要产生 $s$ 的时间,而这 $s$ 的时间不仅仅是加在 $j$ 到 $i$ 这一段
它是加在 $j$ 到 $n$ 的,所以考虑把到 $n$ 的代价也计算进去(把这一段的代价先提前计算)
这样之后转移的时候就不用考虑因为分段而多出来的时间了
设 $st[i]$ 表示前 $i$ 个任务的完成时间和,$sc[i]$ 表示前 $i$ 个任务的费用和
设 $f[i]$ 表示完成前 $i$ 个任务分了若干段的最小代价,那么可以得出 $dp$ 方程:
$f[i]=\sum_{j=1}^{i-1}min(\ f[j]+(sc[n]-sc[j])*S+st[i]*(sc[i]-sc[j])\ )$
然后复杂度是 $n^2$...
发现好像可以斜率优化了,把式子拆开:
$f[i]=f[j]+sc[n]*S-sc[j]*S+st[i]*sc[i]-st[i]*sc[j]$
$f[i]=f[j]-(st[i]+S)sc[j]+sc[n]S+st[i]sc[i]$
$(st[i]+S)sc[j]+f[i]-st[i]sc[i]+sc[n]S=f[j]$
那么 $k=st[i]+S,x=sc[j],b=f[i]-st[i]sc[i]+sc[n]S,y=f[j]$
因为 $k,x$ 单调,所以直接斜率优化...(SDOI那题好像因为 $t[i]$ 可以小于 $0$ 所以要上 $CDQ$ ?)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
typedef double db;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e6+;
int n,S;
int st[N],sc[N];
ll f[N];
inline ll X(int i) { return sc[i]; }
inline ll Y(int i) { return f[i]; }
inline db slope(int i,int j) { return 1.0*(Y(i)-Y(j))/(X(i)-X(j)); }
int Q[N],l=,r=;
int main()
{
n=read(),S=read();
for(int i=;i<=n;i++) st[i]=st[i-]+read(),sc[i]=sc[i-]+read();
for(int i=;i<=n;i++)
{
while( l<r && 1.0*(st[i]+S)>=slope(Q[l],Q[l+]) ) l++;
int j=Q[l];
f[i]=f[j]+(sc[n]-sc[j])*S+st[i]*(sc[i]-sc[j]);
while( l<r && slope(Q[r-],i)<=slope(Q[r-],Q[r]) ) r--;
Q[++r]=i;
}
printf("%lld",f[n]);
return ;
}
luogu P2365 任务安排(FJOI2019 batch)的更多相关文章
- P2365 任务安排 / [FJOI2019]batch(斜率优化dp)
P2365 任务安排 batch:$n<=10000$ 斜率优化入门题 $n^{3}$的dp轻松写出 但是枚举这个分成多少段很不方便 我们利用费用提前的思想,提前把这个烦人的$S$在后面的贡献先 ...
- luogu P2365 任务安排
嘟嘟嘟 如果常规dp,\(dp[i][j]\)表示前\(i\)个任务分\(j\)组,得到 \[dp[i][j] = min _ {k = 0} ^ {i - 1} (dp[k][j - 1] + (s ...
- 2018.07.09 洛谷P2365 任务安排(线性dp)
P2365 任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间 ...
- [Luogu 1160] 队列安排
Luogu 1160 队列安排 链表H2O H2O H2O模板. 太久不写链表,忘干净了,竟调了半个晚上. 保留备用. #include <cstdio> #include <cst ...
- luogu P1160 队列安排
二次联通门 :luogu P1160 队列安排 /* luogu P1160 队列安排 链表 手动模拟一下就好了... */ #include <cstdio> #define Max 5 ...
- P2365 任务安排 batch 动态规划
batch ★☆ 输入文件:batch.in 输出文件:batch.out 简单对比时间限制:1 s 内存限制:128 MB 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不 ...
- tyvj1098[luogu 2365]任务安排 batch
题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti.在每批任务开始 ...
- [洛谷P2365] 任务安排
洛谷题目链接:任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时 ...
- 【luogu P2071 座位安排】 题解
题目链接:https://www.luogu.org/problemnew/show/P2071#sub 邻接表 + 匈牙利 把之前的邻接矩阵匈牙利变成邻接表 要不然存不下... code: #inc ...
随机推荐
- linux下两台服务器文件实时同步方案实现-乾颐堂
假设有如下需求: 假设两个服务器: 192.168.0.1 源服务器 有目录 /opt/test/ 192.168.0.2 目标服务器 有目录 /opt/bak/test/ 实现的目的就是保持这两 ...
- easyui-tabs扩展根据自定义属性打开页签
.增加扩展 <script type="text/javascript" > /** * @author {kexb} easyui-tab扩展根据id切换页面 */ ...
- SSL技术白皮书
首页产品技术操作系统ComwareV5安全和VPN SSL技术白皮书 下载 收藏 打印 推荐 摘自:http://www.h3c.com/cn/d_200812/622834_30003_0.htm# ...
- [GO]方法的重写
package main import "fmt" type Person struct { name string sex byte age int } func (tmp Pe ...
- 【转载】mysql中timestamp,datetime,int类型的区别与优劣
转载来自souldak,微博:@evagle以下内容整合筛选自互联网: int1. 占用4个字节2. 建立索引之后,查询速度快3. 条件范围搜索可以使用使用between4. 不能使用mysql提供的 ...
- g++中宏NULL究竟是什么?
NULL是个指针,还是个整数?0?或(void*)0?答案是和g++版本有关.g++ 4.6支持C++11,引入了nullptr,也许会发生变化. 可以写段简单代码求证一下: #include < ...
- 盒子模型 以及CSS的box-sizing属性。
盒子模型有两种 一种是 内容盒子模型 一种是边框盒子模型. 内容盒子模型(标准盒子模型)由width和height中指定的元素的尺寸不包括内边距和边框 仅是指的内容的实际尺寸: 网上搜索了两张配图不错 ...
- 简单介绍Java的静态分派和动态分派
最近复习JVM的知识,对于静态分派和动态分派的理解有点混乱,于是自己尝试写写代码,在分析中巩固知识. 有如下一段代码,请问每一段分别输出什么? package com.khlin.my.test; c ...
- C,C++面试题2
面试题1:变量的声明和定义有什么区别为变量分配地址和存储空间的称为定义,不分配地址的称为声明.一个变量可以在多个地方声明,但是只在一个地方定义.加入extern修饰的是变量的声明,说明此变量将在文件以 ...
- delphi中的sql语句中空格问题
sql语句中的冒号 ‘’,在delphi中需要用四个冒号表示 ‘’‘’,delphi中的两个冒号只代表一个冒号