洛谷 P3580 - [POI2014]ZAL-Freight(单调队列优化 dp)
考虑一个平凡的 DP:我们设 \(dp_i\) 表示前 \(i\) 辆车一来一回所需的最小时间。
注意到我们每次肯定会让某一段连续的火车一趟过去又一趟回来,故转移可以枚举上一段结束位置,设为 \(j\),那么有转移
\]
在这里我们不妨假设 \(a_i<a_{i+1}\),这个可以通过从左到右扫一遍并执行 \(a_i\leftarrow\max(a_{i-1}+1,a_i)\) 实现。
稍微解释一下上面的式子,由于一趟来回,那么我们肯定会让前面的车都等到第 \(i\) 辆车到达对面后再返回,而第 \(i\) 辆车发车的时间是 \(\max(dp_j+j-i-1,a_i)\),因此第 \(i\) 辆车到达对面的最早时间就是 \(\max(dp_j+j-i-1,a_i)+s\)。而全部 \(j-i+1\) 辆车返程的时间又是 \(s+j-i+1\),总时间就是 \(\max(dp_j+j-i-1,a_i)+2s+j-i-1\)。
如何优化?考虑单调队列。我们考虑拆 \(\max\)。如果 \(dp_j+i-j-1\ge a_i\),也就是 \(dp_j-j\ge a_i-i+1\),\(\max\) 会取到 \(dp_j+i-j-1\),此时 \(dp_j+2s+2i-2j-2\leftarrow dp_i\),我们维护 \(dp_j-2j\) 的最大值即可实现,具体来说,根据 \(dp\) 数组的实际含义,有 \(dp_j-j\) 是单调不降的,因此我们考虑维护一个 \(dp_j-j\) 递增,\(dp_j-2j\) 递减的单调队列,每次 pop 掉队首直到队首元素符合 \(dp_j-j\ge a_i-i+1\) 然后用它更新答案即可。
如果 \(dp_j+i-j-1<a_i\),那么 \(a_i+2s+i-j-1\leftarrow dp_i\),因此我们只用维护 pop 出去的元素的 \(-j\) 的最小值即可,而由于我们是按照 \(j\) 递增的顺序将 \(j\) 的贡献加入单调队列的,因此 \(-j\) 的最小值肯定在上一个被 pop 出去的元素处取到,直接更新答案即可。
时间复杂度线性。
感觉和 AGC 007D 有点像(
应该是 CSP 之前除了模拟赛之外刷的最后一道题了(
using namespace fastio;
const int MAXN=1e6;
int n,s,a[MAXN+5],q[MAXN+5],hd=1,tl=1;ll dp[MAXN+5];
ll calc(int x,int y){return max(1ll*a[y],dp[x]+y-x-1)+2*s+y-x-1;}
int main(){
read(n);read(s);a[0]=-1;
for(int i=1;i<=n;i++) read(a[i]);
for(int i=1;i<=n;i++) a[i]=max(a[i-1]+1,a[i]);
memset(dp,63,sizeof(dp));dp[0]=0;
for(int i=1;i<=n;i++){
while(hd<tl&&dp[q[hd]]-q[hd]<a[i]-i+1) ++hd;
if(hd<=tl) chkmin(dp[i],calc(q[hd],i));
if(hd>1) chkmin(dp[i],calc(q[hd-1],i));
while(hd<tl&&dp[q[tl]]-2*q[tl]>=dp[i]-2*i) --tl;
q[++tl]=i;
}
printf("%lld\n",dp[n]);
return 0;
}
洛谷 P3580 - [POI2014]ZAL-Freight(单调队列优化 dp)的更多相关文章
- 2018.09.26洛谷P3957 跳房子(二分+单调队列优化dp)
传送门 表示去年考普及组的时候失了智,现在看来并不是很难啊. 直接二分答案然后单调队列优化dp检验就行了. 注意入队和出队的条件. 代码: #include<bits/stdc++.h> ...
- 洛谷 P3957 跳房子 —— 二分答案+单调队列优化DP
题目:https://www.luogu.org/problemnew/show/P3957 先二分一个 g,然后判断: 由于转移的范围是一个区间,也就是滑动窗口,所以单调队列优化: 可以先令队尾为 ...
- 洛谷P1725琪露诺(单调队列优化dp)
P1725 琪露诺 题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精.某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪 ...
- BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP
BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...
- 【bzoj3831】[Poi2014]Little Bird 单调队列优化dp
原文地址:http://www.cnblogs.com/GXZlegend/p/6826475.html 题目描述 In the Byteotian Line Forest there are t ...
- 洛谷p1725 露琪诺 单调队列优化的DP
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int ...
- bzoj3831 [Poi2014]Little Bird 单调队列优化dp
3831: [Poi2014]Little Bird Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 505 Solved: 322[Submit][ ...
- 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)
Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
随机推荐
- 项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加)
需求 在整理文件和一些其他头文件的时候,需要对其名称进行整理和修改,此工具很早就应该写了,创业后,非常忙,今天抽空写了一个顺便提供给学习. 工具和源码下载地址 本篇文章的应用包和源码包可在 ...
- Scrum Meeting 0602
零.说明 日期:2021-6-2 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 困难 qsy PM&前端 完成后端管理 ...
- BUAA 软工 结对项目作业
1.相关信息 Q A 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 系统地学习软件工程开发知识,掌握相关流程和技术,提升 ...
- virtual box搭建虚拟机nat和host only网络配置实用
virtual box搭建虚拟机nat和host only网络配置实用 一.背景 二.需求 二.设置虚拟机的网络 1.创建一个全局的nat网络 2.添加主机网络管理器 3.设置虚拟机网络 1.网卡1设 ...
- Sharding-JDBC基本使用,整合Springboot实现分库分表,读写分离
结合上一篇docker部署的mysql主从, 本篇主要讲解SpringBoot项目结合Sharding-JDBC如何实现分库分表.读写分离. 一.Sharding-JDBC介绍 1.这里引用官网上的介 ...
- Linux文件IO操作
来源:微信公众号「编程学习基地」 目录 文件操作 Linux文件类型 Linux文件权限 修改文件权限 Linux error 获取系统调用时的错误描述 打印错误信息 系统IO函数 open/clos ...
- error: unsupported reloc 43
在Ubuntu 16.04.5 LTS编译android 5.1报错 [19:17:13.062]libnativehelper/JniInvocation.cpp:165: error: unsup ...
- CSP2020-儒略历
大家可以在洛谷提交: 题目描述 为了简便计算,天文学家们使用儒略日(Julian day)来表达时间.所谓儒略日,其定义为从公元前 4713 年 1 月 1 日正午 12 点到此后某一时刻间所经过的天 ...
- Java 17 新功能介绍(LTS)
点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Jav ...
- C++ Qt 项目实战(一)之文本编辑器
文本编辑器例图 项目开发环境 系统版本:windows10 QT 版本: 5.9.9 开发语言:C++ 已实现功能 文件操作:新建,打开,保存,另存为,打印,退出 编辑操作:复制,粘贴,剪切,查找,替 ...