P2365 任务安排 / [FJOI2019]batch(斜率优化dp)
batch:$n<=10000$
斜率优化入门题
$n^{3}$的dp轻松写出
但是枚举这个分成多少段很不方便
我们利用费用提前的思想,提前把这个烦人的$S$在后面的贡献先算掉
设$sv[i],st[i]$为费用、时间的前缀和
于是我们就可以得出一个$n^{2}$的方程
$f[i]=f[j]+(sv[i]-sv[j])*st[i]+(sv[n]-sv[j])*S$
拆开:$f[i]=f[j]+sv[i]*st[i]-sv[j]*st[i]+sv[n]*S-sv[j]*S$
移项:$f[j]=(S+st[i])*sv[j]+f[i]-sv[i]*st[i]-sv[n]*S$
再用$y=k*x+b$的套路带进去
$f[j]=(S+st[i])*sv[j]+f[i]-sv[i]*st[i]-sv[n]*S$
$y=k*x+b$
$y=f[j]$
$x=sv[j]$
$k=S+st[i]$(显然随着$i$增大而单调递增)
$b=f[i]-sv[i]*st[i]-sv[n]*S$
于是问题又转化成:找到一个使$b$最小的$(x,y)$
这样就能使$f[i]$最小
考虑到$k$单调递增,$x$也单调递增
我们就可以快乐地用单调队列维护下凸包辣
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef double db;
#define N 10005
db sv[N],st[N],f[N];
int n,S,L,R,h[N];
inline db X(int x){return sv[x];}
inline db Y(int x){return f[x];}
inline db K(int x,int y){return (Y(x)-Y(y))/(X(x)-X(y));}
int main(){
scanf("%d%d",&n,&S);
for(int i=;i<=n;++i){
scanf("%lf%lf",&st[i],&sv[i]);
st[i]+=st[i-]; sv[i]+=sv[i-];
}L=R=;
for(int i=;i<=n;++i){
while(L<R&&K(h[L],h[L+])<=S+st[i]) ++L;
f[i]=f[h[L]]+(sv[i]-sv[h[L]])*st[i]+(sv[n]-sv[h[L]])*S;
while(L<R&&K(h[R-],h[R])>K(h[R],i)) --R;
h[++R]=i;
}printf("%.0lf",f[n]);
return ;
}
P2365 任务安排 / [FJOI2019]batch(斜率优化dp)的更多相关文章
- 洛谷P2365 任务安排 [解法二 斜率优化]
解法一:http://www.cnblogs.com/SilverNebula/p/5926253.html 解法二:斜率优化 在解法一中有这样的方程:dp[i]=min(dp[i],dp[j]+(s ...
- 洛谷P2365 任务安排(斜率优化dp)
传送门 思路: 最朴素的dp式子很好考虑:设\(dp(i,j)\)表示前\(i\)个任务,共\(j\)批的最小代价. 那么转移方程就有: \[ dp(i,j)=min\{dp(k,j-1)+(sumT ...
- 2018.09.05 任务安排(斜率优化dp)
描述 这道题目说的是,给出了n项必须按照顺序完成的任务,每项任务有它需要占用机器的时间和价值.现在我们有一台机器可以使用,它每次可以完成一批任务,完成这批任务所需的时间为一个启动机器的时间S加上所有任 ...
- POJ1180 Batch Scheduling -斜率优化DP
题解 将费用提前计算可以得到状态转移方程: $F_i = \min(F_j + sumT_i * (sumC_i - sumC_j) + S \times (sumC_N - sumC_j)$ 把方程 ...
- bzoj 2726 任务安排 斜率优化DP
这个题目中 斜率优化DP相当于存在一个 y = kx + z 然后给定 n 个对点 (x,y) 然后给你一个k, 要求你维护出这个z最小是多少. 那么对于给定的点来说 我们可以维护出一个下凸壳,因为 ...
- [SDOI2012]任务安排 - 斜率优化dp
虽然以前学过斜率优化dp但是忘得和没学过一样了.就当是重新学了. 题意很简单(反人类),利用费用提前的思想,考虑这一次决策对当前以及对未来的贡献,设 \(f_i\) 为做完前 \(i\) 个任务的贡献 ...
- 斜率优化dp 的简单入门
不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...
- 【学习笔记】动态规划—斜率优化DP(超详细)
[学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...
- HDU 3507 Print Article(斜率优化DP)
题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...
随机推荐
- python nose 自写插件支持用例带进度
在自动化测试过程中,当用例很多且要跑很久时,就会出现这样一个问题,不知道当前跑到第几个用例了,还有多少用例要跑,怎么办? 因为用的nose框架,那就看看nose有没有这样的库支持,结果看了一圈,只找到 ...
- 类似于Mimikatz的Linux Hash Dump工具
项目主页 https://github.com/huntergregal/mimipenguin 需要root权限 支持 Kali 4.3.0 (rolling) x64 (gdm3) Ubuntu ...
- Linux提权:从入门到放弃
*原创作者:piece of the past,本文属Freebuf原创奖励计划,未经许可禁止转载 日站就要日个彻底.往往我们能拿下服务器的web服务,却被更新地比西方记者还快的管理员把内网渗透的种子 ...
- vue v-for的数组改变导致页面不渲染解决方法
直接在数组里,改变数组来达到重新渲染页面的目的, 需要用push等数组方法, 或者$set(),或者给数组重新赋值,来改变数组引用地址 而是直接索引= <body> <div id= ...
- python json读取与解析
url = 'https://auction.jd.com/getJudicatureList.html? callback=jQuery8588604&page=1&limit=40 ...
- js的简单介绍
1.js的介绍 js全称叫javascript,但不是java,他是一门前台语言,而java是后台语言. js的作者是布兰登艾奇. 前台语言:运行在客户端的 后台语言:跟数据库有关的. 2.能干什么? ...
- inner_product
版本1: template < class InputIterator1, class InputIterator2, class T> T inner_product(InputIter ...
- SQL基础语法提纲
一.SQL需知5点 1.SQL是Structured Query Language的缩写,是用来访问关系型数据库的,非过程化的,高级编程语言. 2.SQL具有语法高度综合统一,高度的非过程化,对集合进 ...
- 新建Maven项目时dtd约束出错
新建或者导入Maven项目时出错:org.apache.maven.archiver.MavenArchiver.getManifesteclipse新建maven项目时,pom.xml文件第一行报错 ...
- webpack的externals的使用
externals 官网文档解释的很清楚,就是webpack可以不处理应用的某些依赖库,使用externals配置后,依旧可以在代码中通过CMD.AMD或者window/global全局的方式访问. ...