题解-Cats Transport

Cats Transport

有 \(n\) 个山丘,\(m\) 只猫子,\(p\) 只铲屎官。第 \(i-1\) 个山丘到第 \(i\) 个山丘的距离是 \(d_i\)。第 \(i\) 只猫子在山丘 \(h_i\) 玩 \(t_i\) 时间。每个铲屎官可以选择出发时间,然后从 \(1\) 号山丘一直不停地每秒一个单位走到 \(n\) 号山丘,领走路上已经玩完的猫。求每只猫都被领走的最小猫子等待时间和。

数据范围:\(2\le n\le 10^5\),\(1\le m\le 10^5\),\(1\le p\le 100\),\(1\le d_i\le 10^4\),\(1\le h_i\le n\),\(0\le t_i\le 10^9\)。


可以先预处理一下简化问题:

令 \(D_i=\sum_{j=2}^i d_j\)。

所以 \(1\) 号山丘到 \(i\) 号山丘距离为 \(D_i\)。

令 \(T_i=t_i-D_{h_i}\)。

所以可以视为所有猫咪都在 \(1\) 号山丘,玩完的时间是 \(T_i\)。

将每只猫咪按 \(T_i\) 排序,使 \(T_{i-1}\le T_i\)(每只猫子只需要 \(T_i\) 一个信息即可)。


所以题目就变成了将序列 \(T_i\) 分成 \(p\) 个子序列,使得每个数与它的子序列中最大的数的差的和最小。

这里的子序列不要求连续,但是很明显在 \(T_i\) 有序的情况下,连续更优。

不妨设第 \(a\) 个铲屎官领走了第 \(j+1\sim i\) 只猫子,即子序列中的最大数为 \(T_i\),可以如下 \(\texttt{dp}\):

设 \(f_{a,i}\) 表示到第 \(a\) 个铲屎官领到第 \(i\) 只猫子的最小等待时间和。

\[f_{a,i}=\min\{f_{a-1,j}+\sum_{h=j+1}^i(T_i-T_h)\}
\]

优化一下,令 \(s_i=\sum_{j=1}^i T_j\):

\[\begin{split}
f_{a,i}=&\min\{f_{a-1,j}+T_i(i-j)-(s_i-s_j)\}\\
f_{a,i}=&f_{a-1,j}+T_i(i-j)-(s_i-s_j)\\
f_{a,i}=&f_{a-1,j}+iT_i-jT_i-s_i+s_j\\
f_{a-1,j}+s_j=&T_i\cdot j+f_{a,i}+s_i-iT_i\\
\end{split}
\\
\begin{cases}
y=f_{a-1,j}+s_j\\
k=T_i\\
x=j\\
b=f_{a,i}+s_i-iT_i\\
\end{cases}
\]

套个斜率优化维护 \(\texttt{dp}\) 最小值下凸壳模板即可。


时间复杂度 \(\Theta(n+m\log m+mp)\),空间复杂度 \(\Theta(n+mp)\)。


Code

#include <bits/stdc++.h>
using namespace std; //Start
#define re register
#define il inline
#define mk make_pair
#define pb push_back
#define db double
#define lng long long
#define fi first
#define se second
const int inf=0x3f3f3f3f;
const lng INF=0x3f3f3f3f3f3f3f3f; //Data
const int N=100000,P=100;
int n,m,p;
lng d[N+7],t[N+7],s[N+7]; //DP
lng f[P+7][N+7];
pair<int,int> lor[P+7];
int q[P+7][N+7];
#define l(x) lor[x].fi
#define r(x) lor[x].se
il db X(re int a,re int j){
return j;
}
il db Y(re int a,re int j){
return f[a][j]+s[j];
}
il db slope(re int a,re int k,re int t){
return (Y(a,k)-Y(a,t))/(X(a,k)-X(a,t));
}
il lng F(re int a,re int i,re int j){
return f[a-1][j]+t[i]*(i-j)-(s[i]-s[j]);
}
il lng DP(){
for(re int a=0;a<=p;a++){ //必须初始化
lor[a]=mk(1,0);
q[a][++r(a)]=0;
}
for(re int a=1;a<=p;a++){
for(re int i=1;i<=m;i++){
// printf("(%d,%d)\n",a,i);
while(l(a-1)<r(a-1)&&slope(a-1,q[a-1][l(a-1)],q[a-1][l(a-1)+1])<=t[i]) l(a-1)++;
//维护a-1队列递推
f[a][i]=F(a,i,q[a-1][l(a-1)]);
while(l(a)<r(a)&&slope(a,q[a][r(a)-1],q[a][r(a)])>=slope(a,q[a][r(a)],i)) r(a)--;
//维护a队列为递推a+1做准备
q[a][++r(a)]=i;
}
}
return f[p][m];
} //Main
int main(){
scanf("%d%d%d",&n,&m,&p);
if(p>=m) return puts("0"),0;
for(re int i=2,x;i<=n;i++){
scanf("%d",&x);
d[i]=d[i-1]+x;
}
for(re int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
t[i]=-d[x]+y;
}
sort(t+1,t+m+1);
for(re int i=1;i<=m;i++) s[i]=s[i-1]+t[i];
printf("%lld\n",DP());
return 0;
}

祝大家学习愉快!

题解-Cats Transport的更多相关文章

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

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

  2. 笔记-Cats Transport<已写题解>

    笔记-Cats Transport Cats Transport 令 \(D_i=\sum_{j=1}^id_i\),\(T_i=t_i-D_{h_i}\). 为 \(T_i\) 从小到大排序,令 \ ...

  3. CF311B Cats Transport 斜率优化DP

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

  4. 一本通1609【例 4】Cats Transport

    1609:[例 4]Cats Transport 时间限制: 1000 ms         内存限制: 524288 KB sol:非常偷懒的截图了事 注意:只能猫等人,不能人等猫 对于每只猫,我们 ...

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

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

  6. Cats transport(codeforces311B)(斜率优化)

    \(Cats Transport\) 感觉这道题题面不好讲,就自翻了一个新的,希望有助于大家理解其思路: 大致题意: \(wch\) 的家里有 \(N\) 座山(山呈直线分布,第 \(i-1\) 座山 ...

  7. Cats Transport

    Cats Transport 现在有n座山,第i座山的坐标为\(d_i\),初始p个饲养员在山1,有m只猫,每只猫有一个属性\(h_i,t_i\)表示猫i 在\(h_i\)以及它在\(t_i\)时间后 ...

  8. 题解 CF311B Cats Transport

    前置芝士:斜率优化  剥下这道题的外壳,让它变为一道裸的斜率优化. 很容易想到状态,但复杂度显然过不去,也没有单调性,只能自己创造. 令 $$c[i] = t - sum[i],sum[i] = \s ...

  9. (中等) 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 ...

随机推荐

  1. [LeetCode题解]83. 删除排序链表中的重复元素 | 递归 + 迭代

    方法一:递归 解题思路 通过递归法,每次判断目前头节点与给定的节点是否相等.如是,继续判断下一个节点,否则保存当前头节点,设置 next 指向下次递归得到的节点,然后返回当前节点. 代码 /** * ...

  2. Guitar Pro小课堂之弹唱和弦转换小技巧

    吉他相对其他乐器的便携性,还有其便于弹唱的特点,受到了很多音乐萌新们的喜爱.对于刚刚接触吉他的萌新来说,学琴初期弹唱的时候经常会因为和弦卡顿的转换,和因为食指力度不够或技巧不对无法顺利演奏的大横按,导 ...

  3. Vegas视频FX功能详解

    今天呢,小编就带大家走进Vegas(Win系统)视频FX的世界.那么什么是视频FX呢,就是视频制作软件Vegas中自带添加特效的地方,它可以用于添加模糊,黑白,镜像等滤镜效果,各种高大上的视频大片都需 ...

  4. 头秃了,使用@AutoConfigureBefore指定配置类顺序竟没生效?

    持续原创输出,点击上方蓝字关注我 前言 日常工作中对于Spring Boot 提供的一些启动器可能已经足够使用了,但是不可避免的需要自定义启动器,比如整合一个陌生的组件,也想要达到开箱即用的效果. 在 ...

  5. jenkins master/slave模式

    master是主机,只有master装jenkins slave是小弟机无需装jenkins,主要执行master分配的任务 一.新建slave 1.新建slave的方法:点击magian jenki ...

  6. yii2.0 模态框简单使用

    1 <?php foreach($data as $model) :?> 2 3 <!-- 按钮触发模态框 --> 4 <button class="btn b ...

  7. ubuntu解决安装速度问题

    速度慢得原因:linux系统很多的软件源链接都是在国外服务器上,由于国内防火墙影响导致下载速度极慢,甚至超时. 解决办法一:购买梯子 这样你就可以快速的下载国外服务器的软件包了,但是你得有个可靠得梯子 ...

  8. 分析 5种分布式事务方案,还是选了阿里的 Seata(原理 + 实战)

    好长时间没发文了,最近着实是有点忙,当爹的第 43 天,身心疲惫.这又赶上年底,公司冲 KPI 强制技术部加班到十点,晚上孩子隔两三个小时一醒,基本没睡囫囵觉的机会,天天处于迷糊的状态,孩子还时不时起 ...

  9. 语法解析器续:case..when..语法解析计算

    之前写过一篇博客,是关于如何解析类似sql之类的解析器实现参考:https://www.cnblogs.com/yougewe/p/13774289.html 之前的解析器,更多的是是做语言的翻译转换 ...

  10. Docker Vs Podman

    翻译自 Chetansingh 2020年4月24日的博文<Docker Vs Podman> [1] 容器化的一场全新革命是从 Docker 开始的,Docker 的守护进程管理着所有的 ...