【简洁易懂】CF372C Watching Fireworks is Fun dp + 单调队列优化 dp优化 ACM codeforces
## 题目大意
一条街道有\(n\)个区域。 从左到右编号为\(1\)到\(n\)。 相邻区域之间的距离为\(1\)。
在节日期间,有\(m\)次烟花要燃放。 第\(i\)次烟花燃放区域为\(a_i\) ,幸福属性为\(b_i\),时间为\(t_i\)。\(t_i \leqslant t_{i+1}\)
如果你在第\(i\)次烟花发射时在\(x(1\leqslant x \leqslant n)\)处,你将获得幸福值\(b_i - | a_i - x |\) (请注意,幸福值可能是负值)。
你可以在单位时间间隔内移动最多\(d\)个单位,但禁止走出主要街道。 此外,您可以在初始时刻(时间等于\(1\)时)处于任意区域,并希望最大化从观看烟花中获得的幸福总和。
输出最大的幸福总和。
题目解答
本题是单调队列优化\(DP\)的经典题目。
设\(dp[i][j]\)表示第\(i\)次烟花燃放时你位于\(j\)处所能获得的最大的幸福总和。
而第\(i-1\)次烟花燃放到第\(i\)次烟花燃放所能移动的最大距离为\(h=(t_i-t_{i-1})*d\)。
所以该次燃放后可能获得的幸福总和由上一次位于\([j-h,j+h]\)处的\(2h+1\)种情形得到。
且\(dp[i][j]=\max\{dp[i-1][k]+b[i]-|a[i]-j|\} \quad k\in [j-h,j+h]\)
即\(dp[i][j]=\max\{dp[i-1][k]\}+b[i]-|a[i]-j| \quad k\in [j-h,j+h]\)
故对于\(j\in[1,n]\) ,要求\(dp[i][j]\)的值只要求解\(dp[i-1]\)数组位于\([j-h,j+h]\)的最大值,而求解这一步可以用单调队列解决,复杂度\(O(n)\),即可求解完\(dp[i]\)数组。
又发现\(dp[i]\)数组的求解只与\(dp[i-1]\)数组有关,故这一维可以滚动处理。
\(dp[s1]\)表示源状态,\(dp[s2]\)表示将求解状态,求解完交换\(s1\),\(s2\)即可。\(s1,s2\in\{0,1\}\)
单调队列处理部分
我的代码采用双端队列\(deque\)处理,较为简洁。
\(deque\)存储位置编号
其中\(deque\)中从队首到队尾,位置编号严格增加,该位置源状态\(dp\)源状态值严格减少;
处理位置\(i\)(采用代码中变量意义)时,将还未处理的小于\(i+h\)的位置依次入队尾(可能有些元素会被赶出队尾,因为它们不可能再被使用到),再将小于\(i-h\)的位置依次出队头。则队首所在位置便是源状态位于\([i-h,i+h]\)的最大值,即可得到现状态。
源代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=15e4+10;
LL q,m,d,n,s1=0,s2=1;
LL dp[2][maxn];
int main(){
scanf("%lld%lld%lld%",&n,&m,&d);
LL a,b,t,qian_t=1;
while(m--){
scanf("%lld%lld%lld%",&a,&b,&t);
LL h=(t-qian_t)*d;
qian_t=t;
deque<int> qu;
for(int i=1,j=1;i<=n;i++){
for(;j<=i+h&&j<=n;j++){
while(!qu.empty()&&dp[s1][qu.back()]<=dp[s1][j])qu.pop_back();
qu.push_back(j);
}
while(!qu.empty()&&qu.front()<i-h)qu.pop_front();
dp[s2][i]=dp[s1][qu.front()]+b-abs(i-a);
}
swap(s1,s2);
}
LL maxm=dp[s1][1];
for(int i=2;i<=n;i++){
if(dp[s1][i]>maxm)maxm=dp[s1][i];
}
printf("%lld",maxm);
}
结束语
欢迎留言!你们的支持与推荐是博主发展的动力XD.
【简洁易懂】CF372C Watching Fireworks is Fun dp + 单调队列优化 dp优化 ACM codeforces的更多相关文章
- 题解-------CF372C Watching Fireworks is Fun
传送门 一道有趣的DP 题目大意 城镇中有$n$个位置,有$m$个烟花要放.第$i$个烟花放出的时间记为$t_{i}$,放出的位置记为$a_{i}$.如果烟花放出的时候,你处在位置$x$,那么你将收获 ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
- DP+单调队列 codevs 1748 瑰丽华尔兹(还不是很懂具体的代码实现)
codevs 1748 瑰丽华尔兹 2005年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Descripti ...
- hdu4374One hundred layer (DP+单调队列)
http://acm.hdu.edu.cn/showproblem.php?pid=4374 去年多校的题 今年才做 不知道这一年都干嘛去了.. DP的思路很好想 dp[i][j] = max(dp[ ...
- 习题:烽火传递(DP+单调队列)
烽火传递[题目描述]烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有n个烽火台,每个烽火台 ...
- BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP
BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T ...
- (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- 3622 假期(DP+单调队列优化)
3622 假期 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 黄金 Gold 题目描述 Description 经过几个月辛勤的工作,FJ决定让奶牛放假.假期可以在1-N天内任意选择 ...
- 【优化】单调队列与dp
笔者大概看了一下单调队列对于DP的优化,故撰此文,望有帮助. (dp还是推式子难啊qwq) 例题1. 题目大意:在n个数的序列中,选择数字,使得其连续不超过k个数,且和最大. 本题的方程相对好推:设d ...
- DP+单调队列详解+题目
介绍: 单调队列优化的原理 先回顾单调队列的概念,它有以下特征: (1)单调队列的实现.用双端队列实现,队头和队尾都能插入和弹出.手写双端队列很简单. (2)单调队列的单调性.队列内的元素 ...
随机推荐
- 一套简单的web即时通讯——第三版
前言 接上版,本次版本做了如下优化: 1.新增同意.拒绝添加好友后做线上提示: 2.新增好友分组,使用工具生成后台API,新增好友分组功能,主要功能有:添加分组.重命名分组名称.删除分组 3.新增好友 ...
- Codeforces 776D:The Door Problem(DFS染色)
http://codeforces.com/problemset/problem/776/D 题意:有n个门,m个开关,每个门有一个当前的状态(0表示关闭,1表示打开),每个开关控制k个门,但是每个门 ...
- 事务的隔离级别,mysql默认的隔离级别是什么?
读未提交(Read uncommitted),一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证. (1)所有事务都可以看到其他未提交事务的执行结果 (2)本隔离级别很少用于实际应用 ...
- Redis中的Stream数据类型作为消息队列的尝试
Redis的List数据类型作为消息队列,已经比较合适了,但存在一些不足,比如只能独立消费,订阅发布又无法支持数据的持久化,相对前两者,Redis Stream作为消息队列的使用更为有优势. 相信 ...
- Element-ui DatePicker显示周数
1.场景描述 我们公司是做电商的,运营的工作指标都是按周来定的,所以他们对周特别敏感,希望我们能在日期选择器上显示周数.刚接到这个需求时,心中很不乐意,因为Element-ui的日期选择器根本不支持显 ...
- 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...
- JDK1.8--体验Stream表达式,从一个对象集合中获取每一个对象的某一个值返回新集合
xl_echo编辑整理,欢迎转载,转载请声明文章来源.更多IT.编程案例.资料请联系QQ:1280023003 百战不败,依不自称常胜,百败不颓,依能奋力前行.——这才是真正的堪称强大!! --- 开 ...
- 【攻略】百度货币识别API,搞定防诈骗的应用小程序
1.需求及方案: 近两年用外币进行诈骗的案件很多.例如:2015年12月,一安徽诈骗团伙,用不值1角人民币的50印蒂(intis,秘鲁旧货币,1991年发行新货币后已停止流通,目前无货币价值,仅有&q ...
- .md 文件格式
# .md 文件怎么编写 > 整理一套常用操作,自己来使用 > ## 标题 >> 写法: \# 这是一个一级标题 \## 这是一个二级标题 \### 这是一个三级标题 \### ...
- 百度OCR 文字识别 Android安全校验
百度OCR接口使用总结: 之前总结一下关于百度OCR文字识别接口的使用步骤(Android版本 不带包名配置 安全性弱).这边博客主要介绍,百度OCR文字识别接口,官方推荐使用方式,授权文件(安全模式 ...