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, ...
随机推荐
- 机器学习入门-DBSCAN聚类算法
DBSCAN 聚类算法又称为密度聚类,是一种不断发张下线而不断扩张的算法,主要的参数是半径r和k值 DBSCAN的几个概念: 核心对象:某个点的密度达到算法设定的阈值则其为核心点,核心点的意思就是一个 ...
- UITableView cell 半透明效果,改变cell高度时背景不闪的解决方法
如果直接指定cell.backgroundColor = = [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 ...
- 树莓派Zero W GPIO控制
作者:陈拓 chentuo@ms.xab.ac.cn 2018.06.09/2018.07.05 0. 概述 本文介绍树莓派 Zero W的GPIO控制,并用LED看效果. 0.1 树莓派GPIO编 ...
- 格式与布局 float 左右悬浮边框
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 获取iframe内的元素
$("#iframeID").contents().find("#index_p") 2获取父窗体的值 $('#father', parent.document ...
- Json解析数据的简单使用
简单的记一下Json解析的简单实用: 使用场景:后台传到客户端的Json数据,类似于: string jsonObject="{'Name':'Jack','Age':25}"; ...
- Hibernate一级缓存(补)
------------------siwuxie095 什么是缓存 缓存是介于应用程序和永久性数据存储源(如:硬盘上的 ...
- anaconda+theano+keras手写字符识别新版
标题介绍运行环境了win7 看网上好多keras识别minist 但是一般由于版本问题,无法直接用,,,这里还要特别感谢keras中文文档作者(三当家SCP).教程整的非常好.还有就是最好你在安装an ...
- C++ 内存解析
一.内存基本构成可编程内存在基本上分为这样的几大部分:静态存储区.堆区和栈区.他们的功能不同,对他们使用方式也就不同. 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在 ...
- .net VS2008 时间加减,时间段,时间格式化到秒
举个例子: DateTime time1 = DateTime.Now; DateTime time2 = time1.AddDays(1); time1是当前时间,time2比当前时间多一天.也就是 ...