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 ...
随机推荐
- ORACLE schedule job设置
--创建job begin DBMS_SCHEDULER.CREATE_JOB ( job_name => 'APICALL_LOG_INTERFACE_JOB', job_type => ...
- 一步一步实现视频播放器client(二)
实现主体界面: 222.png (64.46 KB, 下载次数: 0) 下载附件 保存到相冊 前天 21:02 上传 比較常见的一种布局.以下几个button.点击后 ...
- 【PyCharm编辑器】之报:Spellchecker inspection helps locate typos and misspelling in your code, comments and literals, and fix them in one click.问题
如上图,输入一个单词时会出现波浪线,报:Spellchecker inspection helps locate typos and misspelling in your code, comment ...
- 迁移,移动.vagrant.d目录
默认在 C:\Users\***\.vagrant.d 然后下面有boxes目录 想迁移到其它目录 setx VAGRANT_HOME "/d/.vagrant.d/" setx ...
- JavaScrip函数与声明表达式
首先我们看下函数的两种命名方式 1.函数声明,声明一个函数 function test1(){ var a=0; console.log(a); //左一些操作... } 执行结果如下 我们看一下,无 ...
- UITextView的一些技巧
1.在指定位置插入字符串: NSMutableString *TextViewStr=[[NSMutableString alloc] initWithString:TextView.text ...
- python 基础 5.1 python 构造器
一. 类的构造器 __init__ 构造函数,在生成对象时调用.由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去.通过定义一个特殊的__init__方法, ...
- EasyDSS RTMP流媒体服务器web前端:vue组件之间的传值,父组件向子组件传值
之前接触最多的都是EasyNVR,主要针对的都是前端的一些问题.也有接触到一些easydss流媒体服务器. 前端方面的,EasyDSS流媒体服务器与EasyNVR有着根本的不同.EasyNVR使用的是 ...
- 九度OJ 1159:坠落的蚂蚁 (模拟、排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1098 解决:277 题目描述: 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如 ...
- Leslie Lamport
http://lamport.azurewebsites.net/pubs/pubs.html paper