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, ...
随机推荐
- as3 加载gif loader
as3原生不支持gif动态图 loader 加载gif ,内容只是以bitmap加载进来 需要动态,另外衍生类: https://files.cnblogs.com/files/dt1991/GifL ...
- Swift - JPush极光推送的使用3(根据Alias别名,给某个指定用户发推送)(转)
一.别名(alias)介绍 (1)我们可以给每一个安装了应用程序的用户,取不同别名来标识(比如可以使用用户账号的 userid 来作为别名). (2)以后给某个特定用户推送消息时,就可以用此别名来指定 ...
- xslt基础学习
今天下午工作完成没事,登w3c的网站学习了一下xslt的基础知识,主要是因为工作中xml用的比较多,xslt也有用到,所以在这里学习一下. XSLT:一种用于转换 XML 文档的语言. XSLT 用于 ...
- jquery实现背景图片动态适应
背景 在我的一个项目中用到了背景图片,发现其中有一个问题,当页面长度动态变化时,原来能占满全部内容背景的图片会变得不能占满全部背景.如下图的效果: 这是正常的,背景图片占满全屏 当页面内容变长出现了滚 ...
- session会话管理,与过滤器使用,访问控制
1 用户登录,是否注册用户,在登录处理页面进行用户验证,创建session保存用户名和密码 2否,进入用户注册页面 3是,系统保存该用户的登录信息 4进入要访问的页面 5用户直接访问某个页面, 6系统 ...
- 吴裕雄 python神经网络 水果图片识别(1)
import osimport numpy as npimport matplotlib.pyplot as pltfrom skimage import color,data,transform,i ...
- Baidu URL的部分参数
[Baidu URL的部分参数] 1.Baidu Form表单如下: 2.部分参数解析 wd 查询关键字,就是你要搜索的内容. bs 上一次搜索的词或者内容: rn 搜索结果页每页显示的数目,默认 ...
- MySQL语句相关
一.增加 1.基本 2.集合 3.组合 二.删除 1.基本 2.集合 3.组合 1.一个表的查询结果作为另一个表的插入字段之一 <insert id="方法" paramet ...
- ispostback的使用
如果form表单属性里没有 runat="server"就不能使用ispostback因为不会生成__viewstate隐藏域
- 禁止直接访问ashx页面
if (context.Request.ServerVariables["HTTP_REFERER"] == null) { ...