【题解】Cats Transport (斜率优化+单调队列)

# When Who Problem Lang Verdict Time Memory
55331572 Jun/09/2019 19:18UTC+8 Winlere D - Cats Transport GNU C++11 Accepted 405 ms 84200 KB

思考的过程很艰难,想清楚之后就不难做了。记录一下思路过程。

时间 事件
14:00 开始审题
14:15 手玩样例
14:30 Observe \(\times 1\):一个喂养员喂连续的一片
14:50 Observe\(\times2\):一个喂养员喂的连续的一片一定是按照\(t(i)-dis(1,h_i)\)的升序最优
15:00 Brute Force\(\times 1\): \(O(n^2)\)DP,\(dp(i,j)\)考虑了\(i\)个喂养员,带回前\(j\)只猫(按照\(t(i)-dis(1,h_i)\)排序)
15:30 Debug \(\times 1\): \(t(i)-dis(1,h_i)\)不需要对\(0\)取\(max\)
16:30 Solution\(\times 1\) 单调队列
16:50 Solution\(\times2\) 斜率优化+单调队列
吃饭 差点被阿
19:18 Accepted

想的时间占了很多,幸运的是一开始的\(O(n^2)\)DP的方向是对的,一个小时写出暴力还是很赚的。就是后面想什么单调队列,应该可以直接想到斜率优化的,\(n^2\)转\(n \log n\)太常见了。

有两个Observe比较显然就不证明了。\(t_i-dis(1,i)\)可以代表的含义是喂养员最早出来的时刻。

\(O(n^2)\)的转移:

\[dp(i,j)=\min\{dp(i-1,j),dp(i-1,k)+(j-k)\times t_j-(sum(j)-sum(k))\}
\\
sum(i)=\Sigma_{j=1}^it_j-dis(1,j)
\]

拆开\(j,k\)直接变成一个斜率优化的套路式。

\(x_k=k,y_k=dp(i-1,k)+sum(k)\)

原式变为:

\[y_k=t_jx_k+(dp(j)-j\times dis(1,j)+sum(j))
\]

查询一个截距最小值。好像要单调队列维护。查到哪个\(k\)转移套到原式就好了。

不过这里复杂度貌似\(O(n)(k\le 100)\)

  1. //@winlere
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<queue>
  7. using namespace std; typedef long long ll;
  8. inline ll qr(){
  9. register ll ret=0,f=0;
  10. register char c=getchar();
  11. while(c<48||c>57)f|=c==45,c=getchar();
  12. while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
  13. return f?-ret:ret;
  14. }
  15. const int maxn=1e5+5;
  16. int n,m,p;
  17. int dis[maxn];
  18. ll sumd[maxn];
  19. ll sumdata[maxn];
  20. ll x[maxn];
  21. ll y[maxn];
  22. ll dp[101][maxn];
  23. struct NODE{
  24. int pos,time;
  25. ll limit;
  26. NODE(){limit=pos=time=0;}
  27. inline bool operator <(const NODE&a)const{return limit<a.limit;}
  28. inline void scan(){
  29. pos=qr();time=qr();
  30. limit=time-sumd[pos];
  31. }
  32. }data[maxn];
  33. typedef deque<int>::iterator it;
  34. deque < int > q;
  35. int main(){
  36. n=qr();m=qr();p=qr();
  37. for(register int t=2;t<=n;++t)
  38. sumd[t]=(dis[t]=qr())+sumd[t-1];
  39. for(register int t=1;t<=m;++t)
  40. data[t].scan();
  41. sort(data+1,data+m+1);
  42. for(register int t=1;t<=m;++t) sumdata[t]=data[t].limit+sumdata[t-1];
  43. memset(dp,5,sizeof dp);
  44. dp[0][0]=0;
  45. it ita;
  46. for(register int i=0;i<=m;++i)
  47. x[i]=i;
  48. for(register int t=1;t<=p;++t){
  49. for(register int i=0;i<=m;++i){
  50. dp[t][i]=dp[t-1][i];
  51. y[i]=dp[t-1][i]+sumdata[i];
  52. }
  53. q.clear();
  54. for(register int i=1;i<=m;++i){
  55. q.push_back(i-1);
  56. ita=q.begin();
  57. while(q.size()>1&&y[*(ita+1)]-y[*ita]<=1ll*data[i].limit*((*(ita+1))-(*ita))) q.pop_front(),ita=q.begin();
  58. register int j=q.front();
  59. dp[t][i]=min(dp[t][i],dp[t-1][j]+1ll*(i-j)*data[i].limit-(sumdata[i]-sumdata[j]));
  60. ita=q.end()-1;
  61. while(q.size()>1&&(y[*ita]-1ll*y[*(ita-1)])*(i-(*ita))>=1ll*(y[i]-y[*ita])*((*ita)-(*(ita-1)))) q.pop_back(),ita=q.end()-1;;
  62. }
  63. }
  64. cout<<dp[p][m]<<endl;
  65. return 0;
  66. }

【题解】Cats Transport (斜率优化+单调队列)的更多相关文章

  1. CF311B Cats Transport 斜率优化DP

    题面:CF311B Cats Transport 题解: 首先我们观察到山与距离其实是没有什么用的,因为对于任意一只猫,我们都可以直接算出如果有一个人要恰好接走它,需要在哪一时刻出发,我们设第i只猫对 ...

  2. BZOJ.1010.[HNOI2008]玩具装箱toy(DP 斜率优化/单调队列 决策单调性)

    题目链接 斜率优化 不说了 网上很多 这的比较详细->Click Here or Here //1700kb 60ms #include<cstdio> #include<cc ...

  3. Codeforces 311B Cats Transport 斜率优化dp

    Cats Transport 出发时间居然能是负的,我服了... 卡了我十几次, 我一直以为斜率优化写搓了. 我们能得出dp方程式 dp[ i ][ j ] = min(dp[ k ][ j - 1 ...

  4. [bzoj1010](HNOI2008)玩具装箱toy(动态规划+斜率优化+单调队列)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有 的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...

  5. CF331B Cats Transport[斜率优化dp+贪心]

    luogu翻译 一些山距离起点有距离且不同,m只猫要到不同的山上去玩ti时间,有p个铲屎官人要去把所有猫接走,步行速度为1单位每秒,从1走到N座山不停下,必须在猫玩完后才可以把他带走.可以提前出发.问 ...

  6. CodeForces 311 B Cats Transport 斜率优化DP

    题目传送门 题意:现在有n座山峰,现在 i-1 与 i 座山峰有 di长的路,现在有m个宠物, 分别在hi座山峰,第ti秒之后可以被带走,现在有p个人,每个人会从1号山峰走到n号山峰,速度1m/s.现 ...

  7. $CF311B\ Cats\ Transport$ 斜率优化

    AcWing Description Sol 设f[i][j]表示前i个饲养员接走前j只猫咪的最小等待时间. 要接到j猫咪,饲养员的最早出发时间是可求的,设为d: $ d[j]=Tj-\sum_{k= ...

  8. LA-4726 (斜率优化+单调队列)

    题意: 给定一个01序列,选一个长度至少为L 的连续子序列使其平均值最大;输出这个子序列的起点和终点;如果有多个答案,输出长度最小的,还有多个就输出第一个编号最小的; 思路: 用sum[i]表示[1, ...

  9. 题解-Cats Transport

    题解-Cats Transport Cats Transport 有 \(n\) 个山丘,\(m\) 只猫子,\(p\) 只铲屎官.第 \(i-1\) 个山丘到第 \(i\) 个山丘的距离是 \(d_ ...

随机推荐

  1. 串口调试利器--Minicom配置及使用详解

    因为现在电脑基本不配备串行接口,所以,usb转串口成为硬件调试时的必然选择.目前知道的,PL2303的驱动是有的,在dev下的名称是ttyUSB*. Minicom,是Linux下应用比较广泛的串口软 ...

  2. HDU1421

    提交啦n次一直WA,这个bug找啦几个小时,最终才发现数组开小啦,真是遗憾.这是一个典型的DP问题,题目要求从n个中选出k对使得最终疲劳度最小.首先对物品质量a[n]进行一次排序,用dp[i][j]表 ...

  3. 算法之美--2.2 Array

    2016-12-02    00:24:12 利用抽象数据类型实现Array:主要用C++模板实现数组类:体会一个完整的C++类的写法,能顺利写出来的人不多了,特别是对复制构造函数和重载= []运算, ...

  4. 【共享单车】—— React后台管理系统开发手记:Router 4.0路由实战演练

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  5. TP如何进行批量查询

    public function getUserInfo($uid){     if(is_null($uid) || empty($uid)){return false;}     if(is_arr ...

  6. vue2.X props 数据传递 实现组件内数据与组件外的数据的双向绑定

    vue2.0 禁止 子组件修改父组件数据 在Vue2中组件的props的数据流动改为了只能单向流动,即只能由组件外(调用组件方)通过组件的DOM属性attribute传递props给组件内,组件内只能 ...

  7. Cocos2d-x中Vector&lt;T&gt;容器以及实例介绍

    Vector<T> 是Cocos2d-x 3.x推出的列表容器,因此它所能容纳的是Ref及子类所创建的对象指针,其中的T是模板,表示能够放入到容器中的类型,在Cocos2d-x 3.x中T ...

  8. 非常酷的word技巧---删除行前的空格

    今天整理一篇文章的时间遇见一个问题,非常多行前的空格严重影响美观.搞计算机的就是爱折腾.于是做了各种尝试完美解决,以下把方法发布例如以下,事实上非常easy哦! 问题例如以下情况所看到的: 解决的方法 ...

  9. git 操作分支

    1. git 查看本地分支:git branch 2. git 查看所有分支:git branch -a 3. git 新建本地分支:git branch branchName 4. git 新建分支 ...

  10. jquery中的clone()方法

    jquery中不能直接把选择到的元素如$('div')添加到其他地方,而需要使用$('div')[0]等 clone()方法直接复制HTML代码,所以可以直接用来添加元素.