Cats Transport

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

在\(h_i\)以及它在\(t_i\)时间后才能被带走(\(t_i\)之前不算做在等待),现在请安排饲养员的出发时间,每个饲养员的速度都为每个单位长度每个单位时间,让所有的猫被带走之前的等待时间之和最短。

\(2<=n<=10^5,1<=m<=10^5,1<=p<=100\)

注意到饲养员的出发时间是不可能作为状态的,现在让d变为其前缀和,设一个饲养员的出发时间为t,于是考虑等待时间对于一只猫i的等待时间应为\(t+d_{h_i}-t_i\),注意到猫要能够被饲养员带走,必然有\(t+d_{h_i}\geq t_i\),也即\(t\geq t_i-d_{h_i}\),于是为了简单判断猫是否能被带走,我们应该维护一个\(g_i=t_i-d_{h_i}\),为了便于判断一个饲养员能带走哪些猫,我们自然要排序,于是现在即发现问题即哪些连续的猫被哪个饲养员带走,于是问题被转化成了任务安排。

因此设\(f[i][j]\)表示前i个饲养员,带走前j只猫的最少等待时间,设s为g的前缀和,不难有

\[f[i][j]=f[i-1][k]_{0\leq k< i}+\sum_{l=k+1}^j(g_j-g_l)
\]

边界:\(f[0][0]=0\),其余无限大

经整理,它的斜率优化式应为

\[s_k+f[i-1][k]=kg_j+f[i][j]-jg_j+s_j
\]

发现k是递增的,而g也是递增的,于是我们只要用单调队列维护斜率,在按斜率关系弹掉队首,答案取队首即可,时间复杂度易知\(O(np)\)。

参考代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define il inline
#define ri register
#define Size 200050
#define ll long long
using namespace std;
int T[Size],L,R;
ll s[Size],a[Size],sa[Size],dp[101][Size],y[Size];
template<class free>il void read(free&);
int main(){
int n,m,p;read(n),read(m),read(p);
for(int i(2);i<=n;++i)read(s[i]),s[i]+=s[i-1];
for(int i(1),j,k;i<=m;++i)read(j),read(k),a[i]=k-s[j];
sort(a+1,a+m+1);for(int i(1);i<=m;++i)sa[i]=sa[i-1]+a[i];
memset(dp,1,sizeof(dp)),dp[0][0]=0;
for(int i(1),j;i<=p;++i){L=R=1;
for(j=1;j<=m;++j){y[j]=dp[i-1][j]+sa[j];
while(L<R&&(y[T[L+1]]-y[T[L]])<=a[j]*(T[L+1]-T[L]))++L;
dp[i][j]=dp[i-1][T[L]]+(j-T[L])*a[j]-sa[j]+sa[T[L]];
while(L<R&&(y[T[R]]-y[T[R-1]])*(j-T[R])
>=(y[j]-y[T[R]])*(T[R]-T[R-1]))--R;T[++R]=j;
}}printf("%lld",dp[p][m]);
return 0;
}
template<class free>
il void read(free &x){
x&=0;ri char c;while(c=getchar(),c<'0'||c>'9');
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}

Cats Transport的更多相关文章

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

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

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

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

  3. CF311B Cats Transport 斜率优化DP

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

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

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

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

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

  6. 题解-Cats Transport

    题解-Cats Transport Cats Transport 有 \(n\) 个山丘,\(m\) 只猫子,\(p\) 只铲屎官.第 \(i-1\) 个山丘到第 \(i\) 个山丘的距离是 \(d_ ...

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

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

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

  9. CF311B Cats Transport

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

随机推荐

  1. 【Linux】- Systemd 命令篇

    转自:阮一峰的网络日志 Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置. 一.由来 历史上,Linux 的启动一直采用init进程. 下面的命令用来启动服务. ...

  2. JDK在Win10与Ubuntu下的安装与配置

        本文首发于cartoon的博客     转载请注明出处:https://cartoonyu.github.io/cartoon-blog     近段时间把自己电脑(win).虚拟机(Ubun ...

  3. python学习10—迭代器、三元表达式与生成器

    python学习10—迭代器.三元表达式与生成器 1. 迭代器协议 定义:对象必须提供一个next方法,执行该方法或者返回迭代中的下一项,或者返回一个StopIteration异常,以终止迭代(只能往 ...

  4. 枚举对象中的属性 for . . in

    枚举对象中的属性:把对象中所有的属性和值都取出来 使用 for . . . in 语句 语法: for(var  变量  in  对象){ } for  . . . in 语句  对象中有几个属性,循 ...

  5. sqlserver 如何瞬间执行上万条数据

    核心的内容是:使用自定义表类型 第一步:创建存储过程P_T1DeclareInfo_Upload_new 参数: T1DeclareInfo_UploadPNSN_Param  类型 T1Declar ...

  6. 笔记-ubuntu中/home下中文目录改英文

    安装ubuntu后,如果选择的语言是中文,那/home下的文件夹会默认中文,在使用命令行的时候很不方便,此文记录切换成英文的方式,以便日后查看. 将目录重命名为英文 可以使用图形化界面,直接重命名 可 ...

  7. Spring入门(二)

    Spring IOC&DI 控制反转(inversion of control):控制什么?什么反转? 我们都知道,传统的程序中,如果A类需要使用B类对象,会在程序中直接创建B类对象实例,此时 ...

  8. windows server 2012 安装完只有命令行

    今天在安装完windows server 2012 只有命令行,发现没有桌面.然后在别人的提醒下,才发现忘记安装gui了,这个时候,我也懒的重新安装一遍,所以就在网上找如何能够解决问题的方法,下面为解 ...

  9. 单个机器部署redis集群模式(一键部署脚本)

    一.检查机器是否安装gcc.unzip.wget 二.部署模式 #模式1: 将所有主从节点以及sentinel节点部署在同一台机器上 #模式2: 将一个数据节点和一个sentinel节点部署在一台机器 ...

  10. P2290 [HNOI2004]树的计数

    P2290 [HNOI2004]树的计数prufer序列模板题 #include <iostream> #include <cstdio> #include <queue ...