CF331B Cats Transport[斜率优化dp+贪心]
一些山距离起点有距离且不同,m只猫要到不同的山上去玩ti时间,有p个铲屎官人要去把所有猫接走,步行速度为1单位每秒,从1走到N座山不停下,必须在猫玩完后才可以把他带走。可以提前出发。问所有猫最少等待时间之和。
这题一开始有个模糊想法就是$f[i][j]$表示前i个人接j只猫,但是猫是乱序的,必须找一种方法顺序的dp。想到排序。但是排时间抑或是距离都不对,要考虑优先接哪个。然后瞎想到每只猫可以让人在$T_i-dis_i$时刻从起点出发正好接到不用等,那接一堆猫等待时间取决于要求出发最迟的那只猫。把每只猫正好接到要求的出发时间做一下从小到大排个序,一个人接某批猫,每只猫的等待时间就是最大出发时间减去接这只猫的出发时间。然后考虑在这上面dp。然而选的猫不一定连续。可以证明(怎么证?我也不会),只有每个人接这里面连续的一批猫才有可能产生最优解。可以意会一下,我原来连续的一段,中间有一个给下一个人带走,等待时间更长,给上一个人带走,差不多、大概、应当也不优。实在不行可以打表看一下,比较其他划分有没有比连续划分优的。反正我是根据类似经历感觉出来的。
然后方程很好写,区间划分。sum是等待时间前缀和,方便转移。a是等待时间,注意在排完序后就单调了。
$f[i][j]=min\{f[i-1][k]+(j-k)*a[j]-(sum[j]-sum[k])\} $ $ i<=j<=n $ $ i-1<=k<j$
然后拆开写斜截式,搞搞就斜率优化维护下凸壳,又斜率单调增,所以上述$O(pm^2)$化为$O(pm)$
$f[i-1][k]+sum[k]=a[j]*k+j*a[j]+f[i][j]+sum[j]$
记下错误:
初始化又错!初始化又错!初始化又错!LINE23.真的不能再犯了。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+c-'',c=getchar();return f?x=-x:x;
}
const int N=+;
ll f[][N],d[N],a[N],sum[N],hi,ti;
int q[N];
int n,m,p,l,r;
inline ll y(int k,int i){return f[i-][k]+sum[k];} int main(){//freopen("test.in","r",stdin);//freopen("tmp.out","w",stdout);
read(n),read(m),read(p);if(p>=m)return printf("0\n"),;
for(register int i=;i<=n;++i)d[i]=read(d[i])+d[i-];
for(register int i=;i<=m;++i)read(hi),read(ti),a[i]=ti-d[hi];
sort(a+,a+m+);
for(register int i=;i<=m;++i)sum[i]=a[i]+sum[i-],f[][i]=i*1ll*a[i]-sum[i];//MISTAKES!
for(register int i=;i<=p;++i){
q[l=r=]=i-;
for(register int j=i;j<=m;++j){
while(l<r&&y(q[l+],i)-y(q[l],i)<=(q[l+]-q[l])*1ll*a[j])++l;
f[i][j]=f[i-][q[l]]+(j-q[l])*1ll*a[j]-sum[j]+sum[q[l]];
while(l<r&&(y(q[r],i)-y(q[r-],i))*(j-q[r])>=(y(j,i)-y(q[r],i))*(q[r]-q[r-]))--r;
q[++r]=j;
}
}
printf("%I64d\n",f[p][m]);
return ;
}
CF331B Cats Transport[斜率优化dp+贪心]的更多相关文章
- CodeForces 311 B Cats Transport 斜率优化DP
题目传送门 题意:现在有n座山峰,现在 i-1 与 i 座山峰有 di长的路,现在有m个宠物, 分别在hi座山峰,第ti秒之后可以被带走,现在有p个人,每个人会从1号山峰走到n号山峰,速度1m/s.现 ...
- Codeforces 311B Cats Transport 斜率优化dp
Cats Transport 出发时间居然能是负的,我服了... 卡了我十几次, 我一直以为斜率优化写搓了. 我们能得出dp方程式 dp[ i ][ j ] = min(dp[ k ][ j - 1 ...
- CF311B Cats Transport 斜率优化DP
题面:CF311B Cats Transport 题解: 首先我们观察到山与距离其实是没有什么用的,因为对于任意一只猫,我们都可以直接算出如果有一个人要恰好接走它,需要在哪一时刻出发,我们设第i只猫对 ...
- 【题解】Cats Transport (斜率优化+单调队列)
[题解]Cats Transport (斜率优化+单调队列) # When Who Problem Lang Verdict Time Memory 55331572 Jun/09/2019 19:1 ...
- luogu P1721 [NOI2016]国王饮水记 斜率优化dp 贪心 决策单调性
LINK:国王饮水记 看起来很不可做的样子. 但实际上还是需要先考虑贪心. 当k==1的时候 只有一次操作机会.显然可以把那些比第一个位置小的都给扔掉. 然后可以得知剩下序列中的最大值一定会被选择. ...
- $CF311B\ Cats\ Transport$ 斜率优化
AcWing Description Sol 设f[i][j]表示前i个饲养员接走前j只猫咪的最小等待时间. 要接到j猫咪,饲养员的最早出发时间是可求的,设为d: $ d[j]=Tj-\sum_{k= ...
- CF-311B Cats Transport(斜率优化DP)
题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...
- 2018.09.07 codeforces311B. Cats Transport(斜率优化dp)
传送门 斜率优化dp好题. 对于第i只猫,显然如果管理员想从出发开始刚好接到它,需要在t[i]=h[i]−dist(1,i)" role="presentation" s ...
- 斜率优化dp 的简单入门
不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...
随机推荐
- cenos7 修改hostname
hostnamectl set-hostname Linuxidc 如何在CentOS 7上修改主机名 在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient),和灵 ...
- 在Editplus中配置java的(带包)编译(javac)和执行(java)的方法
配置的前提是电脑安装了JDK而且配置好了相关的环境变量(JAVA_HOME,path和classpath). 配置好后在命令行中输入javac和java验证是否配置成功: 假设出现上面的情况则说明配置 ...
- Python中strip方法的妙用
[开胃小菜] 当提到python中strip方法,想必凡接触过python的同行都知道它主要用来切除空格.有下面两种方法来实现. 方法一:用内置函数 #<python> if __name ...
- 二、Silverlight中使用MVVM(二)——提高
在第一篇文章中的示例中,我们已经简单的了解了应用MVVM模式的流程,我的本意是你已经了解了一点MVVM的概念,然后又没有一个较好的例子学习,可以跟着我一起学习MVVM模式,所以这个部分,都是没有理论知 ...
- Spark源码分析之一:Job提交运行总流程概述
Spark是一个基于内存的分布式计算框架,运行在其上的应用程序,按照Action被划分为一个个Job,而Job提交运行的总流程,大致分为两个阶段: 1.Stage划分与提交 (1)Job按照RDD之间 ...
- LightOJ 1068 Investigation (数位dp)
problem=1068">http://www.lightoj.com/volume_showproblem.php?problem=1068 求出区间[A,B]内能被K整除且各位数 ...
- Java各类格式转换
1.Java 根据固定格式的Excel生成实体类 2.GPS 经纬度转换为 经过旋转后的平面坐标
- erlang中遍历取出某个位置的最大值
例:有这么一个列表,A = [["abc","bds",3],["ssdss","dddx",2],["sfa ...
- ajax工作原理(转)
在写这篇文章之前,曾经写过一篇关于AJAX技术的随笔,不过涉及到的方面很窄,对AJAX技术的背景.原理.优缺点等各个方面都很少涉及null.这次写这篇文章的背景是因为公司需要对内部程序员做一个培训.项 ...
- 远程服务器上的weblogic项目管理(三)常用指令及常见错误
weblogic的管理流程已在前两节整理完毕,接下来汇总一下linux环境下的weblogic管理常用指令及常见错误: 常用指令: ./startWebLogic.sh 启动weblogic ./st ...