Codeforces 372 C. Watching Fireworks is Fun (单调队列优化dp)
链接:C. Watching Fireworks is Fun
题意:
城镇中有 n 个位置,有 m 个烟花要放,每秒钟可以移动 d 长度的距离,每个烟花放出的地点和时间分别为 a[i] 和 t[i] , 如果 在烟花放出时 你所在位置为 j 那么得到的快乐值为 b[i]-abs(j-a[i]) .问你能得到的最大快乐值是多少?
思路:
- 设 看第 i 次 烟花时所在位置为 j ,那么 转移方程为 dp[ i ][ j ]=max( dp[ i-1 ][ k ] + b[i] - abs( j - a[i] ) ) , k 的范围为 [ j -d*(t[i]-t[i-1]) , j + d *(t[i]-t[i-1]) ] .
- 那就等价于 对每一次 烟花 的每一个位置 j 我们都要求 长度为 2 * d * t[i] 区间内的最大值,那么问题又变成 求 滑动窗口内的 最大值。注意这里的窗口长度有左右两部分 。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
ll que[maxn],dp[5][maxn],a[maxn],b[maxn],t[maxn],ans=-1e18;
int main (){ios_base::sync_with_stdio(0); cin.tie(0);ll n,m,d;cin>>n>>m>>d;for(int i=1;i<=m;i++) cin>>a[i]>>b[i]>>t[i];for(int i=1;i<=n;i++){dp[0][i]=b[1]-abs(i-a[1]);}int v=1;for(int i=2;i<=m;i++){ll k=(t[i]-t[i-1])*d;if(k==0){for(int j=1;j<=n;j++){dp[v][j]=dp[1-v][j]-abs(j-a[i])+b[i];}v=1-v;continue;}int head=1,tail=1,x=1;for(int j=1;j<=n;j++){while(x<=n&&x-j<=k){ //右边界while(head!=tail&&dp[1-v][que[tail-1]]<=dp[1-v][x]) tail--;que[tail++]=x++;}while(head!=tail&&j-que[head]>k) head++; //左边界dp[v][j]=dp[1-v][que[head]]-abs(j-a[i])+b[i];}v=1-v;}for(int i=1;i<=n;i++) ans=max(ans,dp[1-v][i]);cout<<ans<<endl;
}
Codeforces 372 C. Watching Fireworks is Fun (单调队列优化dp)相关推荐
- 算法笔记--单调队列优化dp
单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...
- poj 2373(单调队列优化dp)
在长为L(<=1000000)的草地(可看成线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的调节范围为[a,b].要求草地的每个点被且只被一个喷水头覆盖,并且有些连续区间必 ...
- poj 1821(单调队列优化dp)
题意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- 【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)
题干: 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是这个游戏比较坑,里面竟然有负数,表示你要支付多少蒜币.因为这些数字都是可见的,所 ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
- POJ 1821 Fence(单调队列优化DP)
题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...
- 【单调队列优化DP】烽火传递 LibreOJ - 10180
题目来源 点我进入提交题目 反思 因为目前在学习单调队列优化DP,所以会往单调队列上面想.然后犯了一个错误就是,认为这个题目只要用单调队列就可以完成,单调队列只是用来减少时间复杂度的,遇到了求最优解的 ...
- AcWing 1089 烽火传递 题解(动态规划—DP—单调队列优化DP)
AcWing 1089 烽火传递 单调队列优化DP,思路比较简单,维护一个保持元素单调递增的单调队列,队首就是第i座烽火台能接收到的,代价最小的方案,加上第i座烽火台的代价就是这座烽火台的最小值 #i ...
最新文章
- Eclipse中集成Tomcat
- Scanner类、Random类、ArrayList类
- vue-cli 3.0 使用全过程讲解
- 手动封装element-ui里面的button组件
- Socket网络编程【获取本机IP】
- Phoenix 关联查询异常 , MaxServerCacheSizeExceededException phoenix.query.maxServerCacheBytes
- NYOJ 擅长排列的小明 II---Problem B
- vivo X Fold屏幕规格揭晓:搭载2K/120Hz E5折叠屏幕
- dart语言中的常量与变量
- 哦?你会视频剪辑?是的。好,录用你!
- 根据IP地址获得地理位置
- 经典神经网络 -- RetinaNet的Focal_Loss : 设计原理与pytorch实现
- 难道我们就是那0.0000001%
- zbrush史上最全笔刷下载43G(1200个)
- DSP程序结构优化技巧
- 在c语言中temp的意思,temp
- 视频无法播放,视频打不开怎么办?可用这款视频修复工具快速修复
- html怎么做向下的图标,用CSS和Bootstrap图标制作上下跳动的指示箭头动画效果
- 【导数术】12.极值点偏移与拐点偏移
- IntelliJ IDEA 项目相关的几个重要概念介绍