洛谷传送门

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=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }return x*f;
}
const int N=2e6+7;
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=1,r=1;
int main()
{n=read(),S=read();for(int i=1;i<=n;i++) st[i]=st[i-1]+read(),sc[i]=sc[i-1]+read();for(int i=1;i<=n;i++){while( l<r && 1.0*(st[i]+S)>=slope(Q[l],Q[l+1]) ) 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-1],i)<=slope(Q[r-1],Q[r]) ) r--;Q[++r]=i;}printf("%lld",f[n]);return 0;
}

转载于:https://www.cnblogs.com/LLTYYC/p/10743196.html

luogu P2365 任务安排(FJOI2019 batch)相关推荐

  1. 【DP】洛谷P2365 任务安排[n方做法]

    链接 https://www.luogu.org/problemnew/show/P2365 大意 一个机器人需要完成nnn个任务,机器人不得更改这些任务的顺序,现在它要把这些任务分成几批,然后开始进 ...

  2. 【luogu P2071 座位安排】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2071#sub 邻接表 + 匈牙利 把之前的邻接矩阵匈牙利变成邻接表 要不然存不下... code: 1 #i ...

  3. 斜率优化dp (P2365/P5785 任务安排)

    斜率优化dp P2365 任务安排 解法一 O(N^3): 解法二:O(N^2): 代码如下: 解法三 O(N): 凸壳: 综上所述: 代码如下: P5785 [SDOI2012]任务安排 分析: 代 ...

  4. 提高篇 第五部分 动态规划 第6章 斜率优化动态规划

    例1 任务安排(TYVJ1098) [tyvj1098]任务安排(dp)_薇小薇-CSDN博客 Tyvj1098 任务安排_Monster__Yi的博客-CSDN博客 P2365 任务安排 任务安排 ...

  5. 斜率优化dp 的简单入门

    不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...

  6. linux自动化作业安排工具cron anacron at batch (2)

    二. anacron<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&g ...

  7. Luogu P2751 [USACO4.2]工序安排Job Processing

    题目描述 一家工厂的流水线正在生产一种产品,这需要两种操作:操作A和操作B.每个操作只有一些机器能够完成. 上图显示了按照下述方式工作的流水线的组织形式.A型机器从输入库接受工件,对其施加操作A,得到 ...

  8. Luogu P1160 【队列安排】

    详细的链表讲解 很明显的一个链表裸题 和普通的链表有一个区别就是这个题 可以O(1)插入,O(1)查询 然后我们为了方便,采用双向链表,定义s.f作为指针数组 更详细的解释见代码 #include&l ...

  9. 如何用Linux的at命令安排一个任务

    at命令是一种在特定时间和日期安排一次性任务的 Linux 终端方法. 计算机擅长自动化,但不是每个人都知道如何使自动化工作.不过,能够在特定的时间为电脑安排一个任务,然后忘记它,这确实是一种享受.也 ...

最新文章

  1. 中缀表达式生成二叉树
  2. boost::format模块format的高级用法示例
  3. js操作改变原数组的解决方法
  4. 字符串之数组中两个字符串的最小距离
  5. 加速度计和陀螺仪数据融合
  6. c++ int自动转换成无符号变量产生的问题
  7. python调用numpy视频_Numpy的文件输入和输出使用
  8. Docker工具箱继续增加
  9. 逍遥模拟器android4.0版本,逍遥安卓模拟器工作室版
  10. Docker 学习笔记
  11. 编码器 x264vfw
  12. 开发者故事|朝九晚六大小周,我就是快乐的技术人
  13. 全球排名前10位的广告公司
  14. WINVNC(二)omni_thread
  15. 英特尔的新硬件套装使制作机器人和无人机更加简单
  16. HotSpot GC及参数设置
  17. 深入浅出,一篇超棒的机器学习入门文章
  18. 电子专业 html,25款专业的 WordPress 电子商务网站主题_html/css_WEB-ITnose
  19. yii2.0.37反序列化漏洞审计
  20. 杭州seo工资高吗?杭州做seo工资一般多少

热门文章

  1. 田志刚:为什么要尊重老师?
  2. 在外企必会的10个英文单词 (Ten words you must mastered for foreign company employee)
  3. OpenCV 图像缩放
  4. locks java_java中Locks的使用
  5. Python遍历字典的方法
  6. UEStudio20中文版
  7. 【学无止境】关于通过PHP链接FTP或SFTP的问题及解决--FTP篇
  8. adreno-gpu-profiler
  9. 2017 《Java技术预备作业》
  10. querySelector