洛谷传送门

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)的更多相关文章

  1. P2365 任务安排 / [FJOI2019]batch(斜率优化dp)

    P2365 任务安排 batch:$n<=10000$ 斜率优化入门题 $n^{3}$的dp轻松写出 但是枚举这个分成多少段很不方便 我们利用费用提前的思想,提前把这个烦人的$S$在后面的贡献先 ...

  2. luogu P2365 任务安排

    嘟嘟嘟 如果常规dp,\(dp[i][j]\)表示前\(i\)个任务分\(j\)组,得到 \[dp[i][j] = min _ {k = 0} ^ {i - 1} (dp[k][j - 1] + (s ...

  3. 2018.07.09 洛谷P2365 任务安排(线性dp)

    P2365 任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间 ...

  4. [Luogu 1160] 队列安排

    Luogu 1160 队列安排 链表H2O H2O H2O模板. 太久不写链表,忘干净了,竟调了半个晚上. 保留备用. #include <cstdio> #include <cst ...

  5. luogu P1160 队列安排

    二次联通门 :luogu P1160 队列安排 /* luogu P1160 队列安排 链表 手动模拟一下就好了... */ #include <cstdio> #define Max 5 ...

  6. P2365 任务安排 batch 动态规划

    batch ★☆   输入文件:batch.in   输出文件:batch.out   简单对比时间限制:1 s   内存限制:128 MB 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不 ...

  7. tyvj1098[luogu 2365]任务安排 batch

    题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti.在每批任务开始 ...

  8. [洛谷P2365] 任务安排

    洛谷题目链接:任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时 ...

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

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

随机推荐

  1. 将windows上面的项目拷贝到Linux环境下报错不能够找到对应的表com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'puyang.ServiceType' doesn't exist

    将一模一样的项目从win迁移到到linux上报错: 一开始还是以为是linux不能识别hql语句,查找资料发现是因为Liunx服务器上mysql是区分大小写的,而本地是不区分的如:代码是这样写的 @E ...

  2. python-字符串-技巧

    1.删除字符串末尾空白:rstrip函数 test1 = "This is a test " print(test1.rstrip()) 但是这种删除只是暂时的,如果想永久删除,则 ...

  3. 怎么用谷歌浏览器查看请求或响应HTTP头?

    要使用谷歌浏览器查看请求或响应HTTP标头,可以采取以下步骤: 在Chrome浏览器,访问一个网址,点击右键,选择检查,打开开发人员工具(或直接按F12). 选择 Network 选项卡. 重新加载页 ...

  4. opencv——pcb上寻找mark点(拟合椭圆的方法)

    #include "stdafx.h" // FitCircle.cpp : 定义控制台应用程序的入口 #include "cv.h" #include &qu ...

  5. 关于HTTP协议传输与接收数据的相关内容

    第一篇: HTTP请求报文和HTTP响应报文 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html 第二篇: 深入浅出U ...

  6. [leetcode] 2. Pascal's Triangle II

    我是按难度往下刷的,第二道是帕斯卡三角形二.简单易懂,题目如下: Given an index k, return the kth row of the Pascal's triangle. For ...

  7. Echarts X轴内容过长自动隐藏,鼠标移动上去显示全部名称方法

    最近公司做项目,使用echarts做开发,碰到一些数据的名称很长导致图例展示的效果不是很好,自己写了一个方法,当X轴内容过长时自动隐藏,鼠标移动上去显示全部名称 样例: 图二是鼠标移动到名称显示的,怎 ...

  8. WCF服务通信测试

    知识需要反复咀嚼,常读常新,简单的WCF通信测试:basicHttpBinding(基本通信)\netTcpBinding(双工通信)\netMsmqBinding(消息队列),简单的测试Demo.简 ...

  9. uwsgi怎么启动停止

    ## 二.启动停止重启 uWSGI 通过 xxx.ini 启动后会在相同目录下生成一个 xxx.pid 的文件,里面只有一行内容是 uWSGI 的主进程的进程号. uWSGI 启动:uwsgi --i ...

  10. ASP.NET MVC实现一个用户只能登录一次 单用户登录

    现在许多网站都要求登录后才能进行进一步的操作,当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线,或者禁止后面的人登录.这里实现的是前一种功能. 网上有许 ...