2018.09.07 codeforces311B. Cats Transport(斜率优化dp)
传送门
斜率优化dp好题。
对于第i只猫,显然如果管理员想从出发开始刚好接到它,需要在t[i]=h[i]−dist(1,i)" role="presentation" style="position: relative;">t[i]=h[i]−dist(1,i)t[i]=h[i]−dist(1,i)的时候出发才行。
这样的话,如果把第l~r只猫分成一组,那么当前分组需要的最小花费是
t[r]−t[l]+t[r]−t[l+1]+t[r]−t[l+2]+...+t[r]−t[r]=t[r]∗(r−l+1)−(sum[r]−sum[l−1])" role="presentation" style="position: relative;">t[r]−t[l]+t[r]−t[l+1]+t[r]−t[l+2]+...+t[r]−t[r]=t[r]∗(r−l+1)−(sum[r]−sum[l−1])t[r]−t[l]+t[r]−t[l+1]+t[r]−t[l+2]+...+t[r]−t[r]=t[r]∗(r−l+1)−(sum[r]−sum[l−1])
于是就可以推出状态转移方程了:
f[i][j]=min(f[i−1][k]+a[j]∗(j−k)+(sum[j]−sum[k]))" role="presentation" style="position: relative;">f[i][j]=min(f[i−1][k]+a[j]∗(j−k)+(sum[j]−sum[k]))f[i][j]=min(f[i−1][k]+a[j]∗(j−k)+(sum[j]−sum[k]))
对于两个不同的决策k1,k2。
如果k1转移出的结果比k2优秀,那么:
f[i−1][k1]+a[j]∗(j−k1)+(sum[j]−sum[k1])<f[i−1][k2]+a[j]∗(j−k2)+(sum[j]−sum[k2])" role="presentation" style="position: relative;">f[i−1][k1]+a[j]∗(j−k1)+(sum[j]−sum[k1])<f[i−1][k2]+a[j]∗(j−k2)+(sum[j]−sum[k2])f[i−1][k1]+a[j]∗(j−k1)+(sum[j]−sum[k1])<f[i−1][k2]+a[j]∗(j−k2)+(sum[j]−sum[k2])
=>((f[i−1][k1]−sum[k1])−(f[i−1][k2]−sum[k2]))<a[j]∗(k1−k2)" role="presentation" style="position: relative;">((f[i−1][k1]−sum[k1])−(f[i−1][k2]−sum[k2]))<a[j]∗(k1−k2)((f[i−1][k1]−sum[k1])−(f[i−1][k2]−sum[k2]))<a[j]∗(k1−k2)
假设t[k]=f[i−1][k]−sum[k]" role="presentation" style="position: relative;">t[k]=f[i−1][k]−sum[k]t[k]=f[i−1][k]−sum[k]
=>(t[k1]−t[k2])/(k1−k2)<a[j]" role="presentation" style="position: relative;">(t[k1]−t[k2])/(k1−k2)<a[j](t[k1]−t[k2])/(k1−k2)<a[j]
果断斜率优化了。
代码:
#include<bits/stdc++.h>
#define N 100005
#define ll long long
using namespace std;
inline ll read(){
ll ans=0,w=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans*w;
}
int q[N],hd,tl,n,m,p,tmp;
ll dis[N],h[N],t[N],sum[N],f[2][N],ans=1e18;
inline ll gety(int k,int i,int j){return f[k][i]+sum[i]-f[k][j]-sum[j];}
inline ll getx(int i,int j){return i-j;}
int main(){
n=read(),m=read(),p=read();
for(int i=2;i<=n;++i)dis[i]=dis[i-1]+read();
for(int i=1;i<=m;++i)tmp=read(),t[i]=read()-dis[tmp];
sort(t+1,t+m+1);
for(int i=1;i<=m;++i)sum[i]=sum[i-1]+t[i];
fill(f[0]+1,f[0]+m+1,1e18);
int las=0;
for(int i=1;i<=p;++i){
hd=tl=1,q[1]=0,las^=1;
for(int j=1;j<=m;++j){
while(hd<tl&&gety(las^1,q[hd+1],q[hd])<t[j]*getx(q[hd+1],q[hd]))++hd;
int k=q[hd];
f[las][j]=f[las^1][k]+t[j]*(j-k)-(sum[j]-sum[k]);
while(hd<tl&&gety(las^1,q[tl],q[tl-1])*getx(j,q[tl])>gety(las^1,j,q[tl])*getx(q[tl],q[tl-1]))--tl;
q[++tl]=j;
}
ans=min(ans,f[las][m]);
}
cout<<ans;
return 0;
}
2018.09.07 codeforces311B. Cats Transport(斜率优化dp)的更多相关文章
- 2018.09.05 任务安排(斜率优化dp)
描述 这道题目说的是,给出了n项必须按照顺序完成的任务,每项任务有它需要占用机器的时间和价值.现在我们有一台机器可以使用,它每次可以完成一批任务,完成这批任务所需的时间为一个启动机器的时间S加上所有任 ...
- 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只猫对 ...
- CF331B Cats Transport[斜率优化dp+贪心]
luogu翻译 一些山距离起点有距离且不同,m只猫要到不同的山上去玩ti时间,有p个铲屎官人要去把所有猫接走,步行速度为1单位每秒,从1走到N座山不停下,必须在猫玩完后才可以把他带走.可以提前出发.问 ...
- 2018.09.29 bzoj3156: 防御准备(斜率优化dp)
传送门 斜率dp经典题目. 然而算斜率的时候并没有注意到下标的平方会爆int于是咕咕*2. 这道题我用了两个数组来表示状态. f[i]f[i]f[i]表示最后i个位置倒数第i个放木偶的最优值. g[i ...
- 【题解】Cats Transport (斜率优化+单调队列)
[题解]Cats Transport (斜率优化+单调队列) # When Who Problem Lang Verdict Time Memory 55331572 Jun/09/2019 19:1 ...
- $CF311B\ Cats\ Transport$ 斜率优化
AcWing Description Sol 设f[i][j]表示前i个饲养员接走前j只猫咪的最小等待时间. 要接到j猫咪,饲养员的最早出发时间是可求的,设为d: $ d[j]=Tj-\sum_{k= ...
- 2018.09.07 Amount of degrees(数位dp)
描述 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K个互不相等的B的整数次幂之和. 例如,设X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意: 17 = 24+20, ...
随机推荐
- leetcode557
public class Solution { public string ReverseWords(string s) { var list = s.Split(' ').AsEnumerable( ...
- Java8函数之旅(四) --四大函数接口
前言 Java8中函数接口有很多,大概有几十个吧,具体究竟是多少我也数不清,所以一开始看的时候感觉一脸懵逼,不过其实根本没那么复杂,毕竟不应该也没必要把一个东西设计的很复杂. 几个单词 在学习 ...
- Struts和Hibernate使用总结
1 struts.xml重定向时报错 action cannot be found in the namespace/ http://blog.csdn.net/greetturin ...
- 因为链接服务器 "SQLEHR" 的 OLE DB 访问接口 "SQLNCLI10" 无法启动分布式事务
1.运行 regedt32,浏览至 HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC. 添加一个 DWORD 值 TurnOffRpcSecurity,值数据为 ...
- Spark数据类型SparseMatrix 解释
http://blog.csdn.net/sinat_29508201/article/details/54089771 parseMatrix Spark的mllib包中提供了机器学习的两种基本数据 ...
- keras、 tensor flow 教程
[keras]http://keras-cn.readthedocs.io/en/latest/getting_started/concepts/,[tensorflow] http://blog.c ...
- Week4-作业1:阅读笔记与思考
我在这三天时间里阅读了<构建之法>的第四章和第十七章,产生了一些疑问和深层次的思考. 第四章 问题1: 书中第68页提到“注释(包括所有源代码)应该只用ASCII字符,不要用中文或其他特殊 ...
- php ip2long 负数问题
官方网站: Note: 因为PHP的 integer 类型是有符号,并且有许多的IP地址讲导致在32位系统的情况下为负数, 你需要使用 "%u" 进行转换通过 sprintf() ...
- windows本地blast
详细可参考https://www.jianshu.com/p/2f125cdf8262:https://blog.csdn.net/qq_34296043/article/details/544277 ...
- blat
1) 产生背景---------------------------------------------------2002年的时候,随着人类基因组项目不断推进,需要将大量ESTs(300万) 及m ...