Cats transport(codeforces311B)(斜率优化)
$ Cats Transport $
感觉这道题题面不好讲,就自翻了一个新的,希望有助于大家理解其思路:
大致题意: $ wch $ 的家里有 $ N $ 座山(山呈直线分布,第 $ i-1 $ 座山到第 $ i $ 座山距离为 $ Di $ )。 $ wch $ 中了 $ M $ 粒种子,第 $ i $ 粒种子在第 $ Hi $ 座山上生长,并在 $ Ti $ 时刻成熟,然后从 $ Ti $ 时刻开始每过一时刻累积一点损坏度(从被采摘的那一刻开始不会继续损坏)。但 $ wch $ 只雇佣了 $ P $ 位农民去采摘(没成熟不采)(农民不能回头)。假设到达某一座山时采摘的时间忽略不计, $ wch $ 和他的农民都住第一座山,农民步行速度为一米每秒,请问在采下所有果实的前提下所有的损坏度最小为多少?(农民可以从负时刻出发)
$ (2 ≤ n ≤ 10^5, 1 ≤ m ≤ 10^5, 1 ≤ p ≤ 10^2,1 ≤ di< 10^4,1 ≤ hi ≤ n, 0 ≤ ti ≤ 10^9) $
$ solution: $
这道题首先不管斜率优化,我们先观察一下题目,(第 $ i $ 粒种子在第 $ Hi $ 座山上生长,并在 $ Ti $ 时刻成熟),我们发现这两样东西似乎都关系到了果实可以何时被采摘(而且距离不涉及后面答案的运算),所以我们将这两个条件合并,从第一座山到第 $ i $ 座山的路程可以预处理出来,而这时只要用 $ Ti-SumD_{Hi} $ 即可相当于每粒种子都种在第一座山上了(只不过成熟时刻变了)。
这时我们发现题目被简化了: $ wch $ 种了m粒种子,第 $ i $ 粒种子将在 $ Ti-SumD_{Hi} $ 时刻成熟(同样从成熟那一刻开始累积损坏度), $ wch $ 只有 $ P $ 次采摘机会(他可以采下在这个时刻前(包括这个时刻)所有成熟的果实),那么在他采下所有果实的前提下总的累积的损坏度最小为多少? --------这时我们观察题面又可以发现成熟时刻早的种子一定先被采掉,于是我们按时间( $ T[i]=t[i]-SumD_{Hi} $ )排个序(为了方便,我们还要求出其前缀和 $ S[i] $ ),然后便不难设出状态了!
设 $ F[i][j] $ 表示用了 $ i $ 次采摘机会收获了前 $ j $ 种果实累积的最小损坏度,这样我们假设第 $ i $ 次采的是第 $ k+1 $ 到 第 $ j $ 枚果实,因为我们已经按照成熟时刻排了序,所以这 $ j-k $ 枚果实一定都是在第 $ j $ 枚果实成熟的那一刻采摘的,于是 $ f[i][j]=f[i-1][k]+(j-k)\times T[j]-(S[j]-S[k]) $ 于是我们枚举所有可行 $ k $ 即可完成转移:
$ f[i][j]=min^{<j}_{k=0}(f[i-1][k]+(j-k)\times T[j]-(S[j]-S[k])) $
但是看了一下数据,我们发现复杂度有点不对,于是我们考虑优化:先把与k无关的项提出来:
$ f[i][j]=[min^{<j}_{k=0}(f[i-1][k]-k\times T[j]+S[k]) ]+j\times T[j]-S[j] $
然后我们发现在 ** $ min $ 函数中与 $ j $ 有关的项只有一个,不过它是一个和 $ k $ 与 $ j $ 都有关的数(这个是斜率优化的标志),而且 ** $ k $ 是单调递增的于是我们便想到用斜率优化:将等式左边只留与k有关的项,等式右边留与j有关的项。
$ f[i-1][k]-S[k]=k\times T[j]+f[i][j]-j\times T[j]+S[j] $
而这就是一个以k为自变量, $ f[i-1][k]-S[k] $ 为因变量的函数,我们建立对应的直角坐标系,上式即为以 $ T[j] $ 为斜率, $ f[i][j]-j\times T[j]+S[j] $ 为截距的直线( $ j\times T[j]+S[j] $ 为定值)。所以我们要让截距最小即可,于是我们维护一个下凸壳。实现:我们建立一个数组 $ g[i]=f[i-1][k]-S[k] $ (其实就是纵坐标),然后我们维护一个单调队列 $ q[] $ ,队列里相邻的两个元素 $ i $ 和 $ j $ 应满足 $ i<j $ 并且 $ \frac{g[q[j]]-g[q[i]]}{q[j]-q[i]} $ 要单调递增。这样我们在枚举 $ j $ 的时候就会将对应的斜率从后面加进去,而提取出来的时候只需要拿当前的斜率(就是枚举的j)从最前面开始比较,直到比队列里的下一个斜率小,这是队头即为最优选择。
复杂度: $ O(p\times m) $
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define rg register int
using namespace std;
int n,m,p;
ll d[100005]; //距离
ll t[100005]; //时间
ll s[100005]; //时间前缀和
ll g[100005]; //f[i-1][k]+s[k]
ll q[100005]; //斜率单调队列
ll f[101][100005]; //斜率优化DP
inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar())) if(ch=='-')sign=1;
while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();
return sign?-res:res;
}
int main(){
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout);
n=qr(); m=qr(); p=qr();
for(rg i=2;i<=n;++i) d[i]=d[i-1]+qr(); //从第一座山到这座山的距离
for(rg i=1;i<=m;++i){
rg x=qr(),y=qr();
t[i]=y-d[x];
}//每一只猫的可以被接走的时间=第一座山到它所在的那座山的距离-它玩耍的时间
sort(t+1,t+m+1); //把这些猫按可以被接走的时间的从小到大的顺序排序
for(rg i=1;i<=m;++i) s[i]=s[i-1]+t[i]; //时间的前缀和
for(rg i=1;i<=m;++i) f[0][i]=(ll)1e18;
for(rg i=1;i<=p;++i){ rg l=1,r=0; //斜率单调队列初始化
for(rg j=1;j<=m;++j) g[j]=f[i-1][j]+s[j]; //f[i-1][k]+s[k]的预处理
for(rg j=1;j<=m;++j){ q[++r]=j-1;
while(l<r&&g[q[l+1]]-g[q[l]]<=t[j]*(q[l+1]-q[l]))++l;
f[i][j]=min(f[i-1][j],g[q[l]]+(j-q[l])*t[j]-s[j]);
while(l<r&&((g[q[r]]-g[q[r-1]])*(j-q[r]))>=((g[j]-g[q[r]])*(q[r]-q[r-1])))--r;
}
}cout<<f[p][m]<<endl;//注意codeforces需要用cout输出
return 0;
}
Cats transport(codeforces311B)(斜率优化)的更多相关文章
- 2018.09.07 codeforces311B. Cats Transport(斜率优化dp)
传送门 斜率优化dp好题. 对于第i只猫,显然如果管理员想从出发开始刚好接到它,需要在t[i]=h[i]−dist(1,i)" role="presentation" s ...
- (中等) CF 311B Cats Transport,斜率优化DP。
Zxr960115 is owner of a large farm. He feeds m cute cats and employs p feeders. There's a straight r ...
- CF311B Cats Transport(斜率优化)
题目描述 Zxr960115 是一个大农场主.他养了m只可爱的猫子,雇佣了p个铲屎官.这里有一条又直又长的道路穿过了农场,有n个山丘坐落在道路周围,编号自左往右从1到n.山丘i与山丘i-1的距离是Di ...
- CF-311B Cats Transport(斜率优化DP)
题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...
- CodeForces - 311B:Cats Transport (DP+斜率优化)
Zxr960115 is owner of a large farm. He feeds m cute cats and employs p feeders. There's a straight r ...
- Codeforces 311B Cats Transport【斜率优化DP】
LINK 题目大意 有一些猫,放在一些位置,人一步移动一个位置 给出每个猫出现的时间,每个人可以自由安排其出发时间,沿途已经出现的猫捡起,猫等待的时间是被减去的时间减去出现的时间 猫可以等人,人不能等 ...
- 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】P2894酒店Hotel(线段树)
题目链接 我好蒻啊 题题看题解 线段树维护从左端点开始的最长连续空房.右端点结束的最长连续空房.整段区间的最长连续空房.区间非空房的个数. http://blog.csdn.net/qq_3955 ...
- 【Luogu】P1879玉米田(状压DP)
题目链接 数据范围这么小,难度又这么大,一般就是状态压缩DP了. 对输入进行处理,二进制表示每一行的草地状况.如111表示这一行草地肥沃,压缩成7. 所以f[i][j]表示第i行状态为j时的方案数 状 ...
- BZOJ 1069 [SCOI2007]最大土地面积 ——计算几何
枚举对角线,然后旋转卡壳即可. #include <map> #include <cmath> #include <queue> #include <cstd ...
- BZOJ3926 [Zjoi2015]诸神眷顾的幻想乡 【广义后缀自动机】
题目 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴 ...
- bzoj1734 [Usaco2005 feb]Aggressive cows 愤怒的牛 二分答案
[Usaco2005 feb]Aggressive cows 愤怒的牛 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 407 Solved: 325[S ...
- 仓库建设(bzoj 1096)
Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天, ...
- 填报志愿(codevs 2930)
题目描述 Description 高考已经结束,而志愿填报正在进行中- 吴校长的学校里有n位同学,每位同学有ki个愿意去的大学.而在吴老师的省份中,有m所大学有招生名额.根据往年的经验,对于每所大学( ...
- MongoDB_起步
MongoDB基本概念 <1> mogoDB是一个文档存储类型的nosql数据库,文档存储一般用类似json的格式存储,存储的内容是文档型的. 这样也就有机会对某些字段建立索引, < ...
- lnux 下 core文件
1. core文件的简单介绍在一个程序崩溃时,它一般会在指定目录下生成一个core文件.core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的. 2. 开启或关闭core文件的生成用以下 ...
- nginx配置 location root alias
语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因 ...