题目链接

题目描述

小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员。

农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号。

第 \(i\) 座山与第 \(i-1\) 座山之间的距离为 \(D_i\)。

饲养员都住在 \(1\) 号山。

有一天,猫出去玩。

第 \(i\) 只猫去 \(H_i\)号山玩,玩到时刻 \(T_i\)

停止,然后在原地等饲养员来接。

饲养员们必须回收所有的猫。

每个饲养员沿着路从 $1 $号山走到 N 号山,把各座山上已经在等待的猫全部接走。

饲养员在路上行走需要时间,速度为\(1\)米/单位时间。

饲养员在每座山上接猫的时间可以忽略,可以携带的猫的数量为无穷大。

例如有两座相距为 1 的山,一只猫在 2 号山玩,玩到时刻 3 开始等待。

如果饲养员从 1 号山在时刻 2 或 3 出发,那么他可以接到猫,猫的等待时间为 0 或 1。

而如果他于时刻 1 出发,那么他将于时刻 2 经过 2 号山,不能接到当时仍在玩的猫。

你的任务是规划每个饲养员从 1 号山出发的时间,使得所有猫等待时间的总和尽量小。

饲养员出发的时间可以为负。

分析

接猫是任务,p个饲养员,每个饲养员接猫可以看作把几个猫放到一个集合。

第\(i\)个猫被一个饲养员从1号点出发去接,等待时间与饲养员出发时刻有关。但出发时刻必须大于\(T[i] -\sum_{1}^iD[i]\)。将这个时间排个序,可以把这个猫看作若干个任务,可以贪心的证明把这些排序后的任务分成若干个不相交的部分会是最优的,如果相交了会有多余的花费(脑部一下,中间空出来的几个分到别的组,这几个猫的等待时间白白增加)。

假设算出了前\(k-1\)个饲养员的所有解。\(d[k][i]\)表示前\(k\)个饲养员接走前 \(i\)只猫时的答案。转移方程呼之欲出

\[d[k][i] = max\{d[k-1][j] + A_i*(i-j)-(s_i-s_)\},s[i] = \sum_1^iA[i]
\]

把max去掉,得到最优的\(j\)满足

\[d[k-1][j]+s_j = A_i*j+d[k][i]-A_i*i+s_i
\]

标准斜率优化DP,\(A_i\)递增。

另外由于P最大200,所以可以滚动数组优化掉一维

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
typedef long long ll;
ll H[N],D[N],A[N],s[N],d[2][N],n,m,p,T[N];
int q[N];
int main(){
scanf("%lld%lld%lld",&n,&m,&p);
for(int i=2;i<=n;i++){
scanf("%lld",&D[i]);
D[i] += D[i-1];
}
for(int i=1;i<=m;i++){
scanf("%lld%lld",&H[i],&T[i]);
A[i] = T[i] - D[H[i]];
}
sort(A+1,A+1+m);
for(int i=1;i<=m;i++){
s[i] = s[i-1] + A[i];
}
for(int i=1;i<=m;i++)d[1][i] = 1ll * i * A[i] - s[i];
for(int k=2,w=0;k<=p;k++,w^=1){
int l = 0,r = 0;
for(int i=1;i<=m;i++){
while(l < r && (d[w^1][q[l+1]] - d[w^1][q[l]] + s[q[l+1]] - s[q[l]]) <= A[i] * ((q[l+1] - q[l])))l++;
int j = q[l];
//cout << l << ' ' << r << ' ' << j << ' ' << d[w^1][j] << endl;
d[w][i] = d[w^1][j] + 1ll * (i-j) * A[i] - (s[i]-s[j]);
while(l < r && (d[w^1][q[r-1]] - d[w^1][q[r]] + s[q[r-1]] - s[q[r]]) * (q[r-1]-i) > (d[w^1][q[r-1]] - d[w^1][i] + s[q[r-1]] - s[i]) * (q[r-1] - q[r]))r--;
q[++r] = i;
}
}
printf("%lld\n",d[p&1][m]);
return 0;
}

CF-311B Cats Transport(斜率优化DP)的更多相关文章

  1. Codeforces 311B Cats Transport 斜率优化dp

    Cats Transport 出发时间居然能是负的,我服了... 卡了我十几次, 我一直以为斜率优化写搓了. 我们能得出dp方程式 dp[ i ][ j ] = min(dp[ k ][ j - 1 ...

  2. CodeForces 311 B Cats Transport 斜率优化DP

    题目传送门 题意:现在有n座山峰,现在 i-1 与 i 座山峰有 di长的路,现在有m个宠物, 分别在hi座山峰,第ti秒之后可以被带走,现在有p个人,每个人会从1号山峰走到n号山峰,速度1m/s.现 ...

  3. CF311B Cats Transport 斜率优化DP

    题面:CF311B Cats Transport 题解: 首先我们观察到山与距离其实是没有什么用的,因为对于任意一只猫,我们都可以直接算出如果有一个人要恰好接走它,需要在哪一时刻出发,我们设第i只猫对 ...

  4. CF331B Cats Transport[斜率优化dp+贪心]

    luogu翻译 一些山距离起点有距离且不同,m只猫要到不同的山上去玩ti时间,有p个铲屎官人要去把所有猫接走,步行速度为1单位每秒,从1走到N座山不停下,必须在猫玩完后才可以把他带走.可以提前出发.问 ...

  5. 【题解】Cats Transport (斜率优化+单调队列)

    [题解]Cats Transport (斜率优化+单调队列) # When Who Problem Lang Verdict Time Memory 55331572 Jun/09/2019 19:1 ...

  6. (中等) CF 311B Cats Transport,斜率优化DP。

    Zxr960115 is owner of a large farm. He feeds m cute cats and employs p feeders. There's a straight r ...

  7. $CF311B\ Cats\ Transport$ 斜率优化

    AcWing Description Sol 设f[i][j]表示前i个饲养员接走前j只猫咪的最小等待时间. 要接到j猫咪,饲养员的最早出发时间是可求的,设为d: $ d[j]=Tj-\sum_{k= ...

  8. 2018.09.07 codeforces311B. Cats Transport(斜率优化dp)

    传送门 斜率优化dp好题. 对于第i只猫,显然如果管理员想从出发开始刚好接到它,需要在t[i]=h[i]−dist(1,i)" role="presentation" s ...

  9. 斜率优化DP学习笔记

    先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...

随机推荐

  1. unity 卡牌聚拢算法

    unity 卡牌聚拢算法 前言 代码 前言 笔者在做项目时遇到了一个要聚拢手牌,像三国杀里的手牌聚拢的效果 大概效果图: 代码 public Dictionary<int, int> le ...

  2. PHP SDK短信接口

    /** * sdk 短信接口 * @param $tel 手机号 * @param $content 短信内容 * @return bool */ public function telSDK($te ...

  3. 【.NET 与树莓派】使用 GPIO 库

    上回老周在说准备工作的时候,提到过树莓派用金属盒散热的事情.有朋友会说,加了金属盒子接线不方便,就算用了"T"形板,毕竟是把导线延长了的.其实扩展板就是把原有的引脚引出(类似于延长 ...

  4. MySQL查询截取分析

    一.查询优化 1,mysql的调优大纲 慢查询的开启并捕获 explain+慢SQL分析 show profile查询SQL在Mysql服务器里面的执行细节和生命周期情况 SQL数据库服务器的参数调优 ...

  5. Linux删除文件后磁盘目录不释放

    今天测试oracle数据库的时候,把表空间连带内容和数据文件一并删除了,但是删除之后,查看数据文件不存在了,但是目录的带下没有释放 SQL> drop tablespace users incl ...

  6. Pytorch入门——手把手教你MNIST手写数字识别

    MNIST手写数字识别教程 要开始带组内的小朋友了,特意出一个Pytorch教程来指导一下 [!] 这里是实战教程,默认读者已经学会了部分深度学习原理,若有不懂的地方可以先停下来查查资料 目录 MNI ...

  7. 渗透测试中期--漏洞复现--MS08_067

    靶机:Win2k3    10.10.10.130 攻击机:BT5      10.10.10.128 一:nmap 查看WinK3是否开放端口3389 开放3389方法:我的电脑->属性-&g ...

  8. Ubuntu18.04完全卸载mysql5.7并安装mysql8.0的安装方法

    Ubuntu18.04版本下,如果直接输入: sudo apt install mysql-server 命令,会默认安装mysql5.7版本,安装过程并没有提示输入密码,安装完成后也无法正常登录,这 ...

  9. [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本

    [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 目录 [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 0x00 摘要 0x01 背景 1.1 代码进化 1.2 Deep ...

  10. Eureka详解系列(二)--如何使用Eureka(原生API,无Spring)

    简介 通过上一篇博客 Eureka详解系列(一)--先谈谈负载均衡器 ,我们知道了 Eureka 是什么以及为什么要使用它,今天,我们开始研究如何使用 Eureka. 在此之前,先说明一点.网上几乎所 ...