正题


题目大意

有nnn个人mmm辆车。
人有tit_iti​,车有fjf_jfj​。第i个人修第j俩车时间是ti∗fjt_i*f_jti​∗fj​。
一辆车要每个人都修一遍,且一个人修好后要求下一个人没有工作。对于每辆车找一个修理开始时间要求总修理时间最小(得按顺序修)。


解题思路

定义ti=∑i=1mtit_i=\sum_{i=1}^mt_iti​=∑i=1m​ti​
设gig_igi​表示第iii辆车开始的时间,然后答案就是gm+fn∗sig_m+f_n*s_igm​+fn​∗si​
且有gi=gi−1+max⁡{tk∗fi−1−tk−1∗fi}g_i=g_{i-1}+\max\{t_k*f_{i-1}-t_{k-1}*f_i\}gi​=gi−1​+max{tk​∗fi−1​−tk−1​∗fi​}
时间复杂度O(nm)O(nm)O(nm)
愉快TLETLETLE,我们考虑斜率优化
对于决策j,kj,kj,k,且kkk比jjj优
那有tk∗fi−1−tk−1∗fi>tj∗fi−1−tj−1∗fit_k*f_{i-1}-t_{k-1}*f_i>t_j*f_{i-1}-t_{j-1}*f_itk​∗fi−1​−tk−1​∗fi​>tj​∗fi−1​−tj−1​∗fi​
⇒(tk−tj)∗fi−1>(tk−1−tj−1)∗fi\Rightarrow (t_k-t_j)*f_{i-1}>(t_{k-1}-t_{j-1})*f_i⇒(tk​−tj​)∗fi−1​>(tk−1​−tj−1​)∗fi​
⇒tk−tjtk−1−tj−1>fifi−1\Rightarrow \frac{t_k-t_j}{t_{k-1}-t_{j-1}}>\frac{f_i}{f_{i-1}}⇒tk−1​−tj−1​tk​−tj​​>fi−1​fi​​

然后我们发现fifi−1\frac{f_i}{f_{i-1}}fi−1​fi​​并不是单调递增的,但是tk−tjtk−1−tj−1\frac{t_k-t_j}{t_{k-1}-t_{j-1}}tk−1​−tj−1​tk​−tj​​肯定越大越优,所以我们可以按照tk−tjtk−1−tj−1\frac{t_k-t_j}{t_{k-1}-t_{j-1}}tk−1​−tj−1​tk​−tj​​维护一个单调递增的单调队列,然后就可以对于每个fifi−1\frac{f_i}{f_{i-1}}fi−1​fi​​在单调队列上二分。
时间复杂度O(mlog⁡n)O(m\log n)O(mlogn)


codecodecode

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=110000;
ll n,m,t[N],f[N],q[N],g[N],tail;
double tan_(ll x,ll y)
{return (t[x]-t[y])/(double)(t[x-1]-t[y-1]);}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)scanf("%lld",&t[i]),t[i]+=t[i-1];for(ll i=1;i<=m;i++)scanf("%lld",&f[i]);for(ll i=1;i<=n;i++){while(tail>1&&tan_(i,q[tail])>tan_(q[tail],q[tail-1])) tail--;q[++tail]=i;}for(ll i=2;i<=m;i++){ll l=0,r=tail;double k=(double)f[i]/(double)f[i-1];while(l<r){ll mid=(l+r)/2;if(tan_(q[mid+1],q[mid])>k) l=mid+1;else r=mid;}g[i]=g[i-1]+t[q[l]]*f[i-1]-t[q[l]-1]*f[i];}printf("%lld",g[m]+t[n]*f[m]);
}

jzoj3169-[GDOI2013模拟4]生产汽车【斜率优化dp,单调队列,二分】相关推荐

  1. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  2. CF-311B Cats Transport(斜率优化DP)

    题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...

  3. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

  4. HDU-3507Print Article 斜率优化DP

    学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...

  5. APIO2010 特别行动队 斜率优化DP算法笔记

    做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...

  6. HDU 3507 Print Article(斜率优化DP)

    题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...

  7. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

  8. YBTOJ洛谷P3195:玩具装箱(斜率优化dp)

    传送门 文章目录 前言 解析 代码 前言 斜率优化dp,就是利用斜率优化的dp (逃) 解析 第一道斜优的题 分析题目 设sumisum_isumi​为1-i的c的前缀和 容易写出dp转移式: dpi ...

  9. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 11893  Solved: 5061 [Submit] ...

最新文章

  1. 怎样做才是最优雅方式切换 web 项目数据源 ?
  2. iOS开发几年了,你清楚OC中的这些东西么!!!?
  3. [Vue warn]: Failed to mount component: template or render function not defined. 错误解决方法
  4. oracle+字段+virtual,Oracle 11g新特性之--虚拟列(Virtual Column)
  5. P2799国王的魔镜
  6. 怎样更改itunes备份位置_什么是iTunes备份文件?
  7. 【计算机网络】计算机网络的组成
  8. 盘点!电价市场化改革后,数据中心电费涨了多少?
  9. 短信验证注册,一个完整而优雅的JAVA后端实现
  10. 排障集锦:九九八十一难之第十八难!-----System has not been booted with systemd as init system (PID 1). Can‘t operat
  11. 【伸手党福利】【第一弹】jeecg-boot前端主要更改位置(网站标题栏图标、logo、登录后的logo、显示的标题文字、用户头像)
  12. Webpack前端资源加载/打包工具
  13. FaceID调用的几个注意点
  14. STM32+BM8563时钟芯片不走时问题解决(含配置代码)
  15. 麦克斯韦方程组的物理意义是什么
  16. sim7600ce 拨号上网测试_sim7600ce拨号上网
  17. CADe_SIMu V1.0.0.1手把手学习笔记(5)
  18. 常用ASP代码加密工具的工作原理
  19. 【prompt】什么是 Soft Prompt 和 Hard Prompt ?
  20. Android中的跨进程回调

热门文章

  1. makefile obj文件路径_Makefile一问:如何修改.o输出文件的输出路径 Linux/Unix社区 / 程序开......
  2. 数学中R,Z,N,Q都代表什么意思?
  3. [C++STL]C++实现unordermap容器和unorderset容器
  4. [剑指offer]面试题35:第一个只出现一次的字符
  5. Sumsets POJ - 2229(计数dp)
  6. 数据结构与算法--二叉树第k个大的节点
  7. linux6.5dns装什么,CentOS6.5安装DNS服务
  8. maximum mean discrepancy
  9. Deeplab 在Qt Creator下编译报错undefined reference to Mat_xxx
  10. dsu on tree 题集 + ac代码