F - Watching Fireworks is Fun
题目大意:
一个城镇有n个区域,从左到右1-n,每个区域之间距离1个单位距离。节日中有m个烟火要放,给定放的地点a[ i ]、时间t[ i ] ,如果你当时在区域x,那么你可以获得b[ i ] - | a[ i ] - x |的happiness 。你每个单位时间可以移动不超过d个单位距离,你的初始位置是任意的,求你通过移动能获取到的最大的happiness值。
我感觉很难,而且其实也不是特别熟悉单调队列,对于单调队列的运用也不是特别熟练。
这个题目首先你要找状态,这个状态就是时间和位置,所以我们可以先定义 dp[i][j] 表示第 i 时刻在位置 j 的最大幸福值。
但是这个时间有 1e9 不过只有300个物品,就是可以离散化一下,就只有300了,但是位置有150000 这个放进dp数组还是超时了。
不过每一个时间只和上一个时间有关系,所以这个时候就可以用滚动数组了,所以最后就是dp[2][2e5]
这个题目为什么要用单调队列呢,因为如果不是同一时刻绽放的烟花,是有移动距离的,这一段距离的最大幸福度就可以用单调队列来找到。
这个就是我们枚举每一个 j 的位置,上一个烟花在 j 两边左右为 d*t 的距离绽放都是可以让这一个烟花在 j 位置绽放。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn = 2e5 + ;
typedef long long ll;
//首先枚举每一个物品,然后再去dp转移找到这个物品的最优解,就是abs(a[i]-x)的最小值
//具体就是用一个来表示时间的转移,然后对于每一个物品,如果这个时间恰好是烟花绽放的时间,那就直接从上一个转移过来
//如果不是,就是说明有一段路可以走,那就用单调队列,维护每一个点的一段区间的最大值
ll que[maxn], dp[][maxn];
ll a[maxn], b[maxn], t[maxn]; int main()
{
ll n, m, k;
scanf("%lld%lld%lld", &n, &m, &k);
for (int i = ; i <= m; i++) scanf("%lld%lld%lld", &a[i], &b[i], &t[i]);
ll pretime = t[];
int id = ;
for(int i=;i<=m;i++)
{
if(pretime==t[i])
{
for(int j=;j<=n;j++)
{
dp[id][j] = dp[id ^ ][j] + b[i] - abs(a[i] - j);
}
}
else
{
ll x = t[i] - pretime;
pretime = t[i];
int f1 = , t1 = ;
int r = ;
for(int j=;j<=n;j++)
{
while(r<=n&&r<=x*1ll*k+j)
{
while (t1 >= f1 && dp[id ^ ][r] > dp[id ^ ][que[t1]]) t1--;
que[++t1] = r++;
}
while (f1 <= t1 && que[f1] < j - x * k) f1++;
dp[id][j] = dp[id ^ ][que[f1]] + b[i] - abs(a[i] - j);
}
}
id ^= ;
}
ll ans = -inf64;
for (int i = ; i <= n; i++) {
ans = max(ans, dp[id ^ ][i]);
}
printf("%lld\n", ans);
return ;
}
单调队列优化dp
F - Watching Fireworks is Fun的更多相关文章
- 单调队列+线性dp题Watching Fireworks is Fun (CF372C)
一.Watching Fireworks is Fun(紫题) 题目:一个城镇有n个区域,从左到右1编号为n,每个区域之间距离1个单位距离节日中有m个烟火要放,给定放的地点ai,时间ti当时你在x,那 ...
- Codeforces Round #219 (Div. 1) C. Watching Fireworks is Fun
C. Watching Fireworks is Fun time limit per test 4 seconds memory limit per test 256 megabytes input ...
- Codeforces Round #219 (Div. 2) E. Watching Fireworks is Fun
http://codeforces.com/contest/373/problem/E E. Watching Fireworks is Fun time limit per test 4 secon ...
- CF372C Watching Fireworks is Fun(单调队列优化DP)
A festival will be held in a town's main street. There are n sections in the main street. The sectio ...
- C. Watching Fireworks is Fun(Codeforces 372C)
C. Watching Fireworks is Fun time limit per test 4 seconds memory limit per test 256 megabytes input ...
- 【单调队列优化】[CF372C] Watching Fireworks is Fun
突然发现我可能单调队列都打不来了...我太菜了... 这道题显然有$$f[i][j]=min\{f[i-1][k]+\vert j-a[i] \vert\}$$ 则$ans=\sum_{i=1}^{m ...
- 题解-------CF372C Watching Fireworks is Fun
传送门 一道有趣的DP 题目大意 城镇中有$n$个位置,有$m$个烟花要放.第$i$个烟花放出的时间记为$t_{i}$,放出的位置记为$a_{i}$.如果烟花放出的时候,你处在位置$x$,那么你将收获 ...
- 【简洁易懂】CF372C Watching Fireworks is Fun dp + 单调队列优化 dp优化 ACM codeforces
题目大意 一条街道有$n$个区域. 从左到右编号为$1$到$n$. 相邻区域之间的距离为$1$. 在节日期间,有$m$次烟花要燃放. 第$i$次烟花燃放区域为$a_i$ ,幸福属性为$b_i$,时间为 ...
- Fireworks(whole page)
<!DOCTYPE HTML> <html> <head> <title>Canvas 实现放烟花特效</title> <meta c ...
随机推荐
- x86汇编之栈与子程序调用
什么是栈 栈与普通数据结构所说的栈的概念是相似的,遵循后进先出原则.不同的是汇编中所说的栈是一个在内存中连续的保存数据的区域,也即是实际存在的内存区域,进栈和出栈遵循后进先出原则. 在x86架构中,栈 ...
- vue2.x学习笔记(十七)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12616847.html. 动态组件&异步组件 在前面学习组件基础的时候学习过动态组件,官方文档给出过一个例 ...
- Python推荐系统框架:RecQ
RecQ是一个用于推荐系统的python库(python2.7.x),实现了一些state-of-the-art的推荐算法. github地址:https://github.com/Coder-Yu/ ...
- Java集合linkdList
LinkedList特有功能: A:添加功能 public void addFitst(Object e) public void addLast(Object e) B:获取功能 public Ob ...
- .NET Core下的开源分布式任务调度系统ScheduleMaster-v2.0低调发布
从1月份首次公开介绍这个项目到现在也快4个月了,期间做了一些修修补补整体没什么大的改动.2.0算是发布之后第一个大的版本更新,带来了许多新功能新特性,也修复了一些已知的bug,在此感谢在博客.Issu ...
- XSS语义分析的阶段性总结(二)
本文首发于“合天智汇”微信公众号,作者:Kale 前言 上次分享了javascript语义分析,并且简单介绍了新型xss扫描器的一些想法,如何在不进行大量fuzz的情况下又能准确的检测出xss漏洞,这 ...
- 9、flink的状态与容错
1.理解State(状态) 1.1.State 对象的状态 Flink中的状态:一般指一个具体的task/operator某时刻在内存中的状态(例如某属性的值) 注意:State和Checkpoint ...
- Scrapy爬虫框架(1)--安装配置与常用命令
安装与配置 Scrapy有几个安装依赖,一般来说可以直接pip install scrapy,这个过程会自动下载安装其他几个依赖. 上述安装方法不成功,则需要手动安装依赖包 步骤 安装 lxmlpip ...
- centos 7 安装更新php5.6
epel remi 什么的把我弄晕了 不深研这东西了,直接按步骤操作更新了. # yum install epel-release # rpm -ivh http://rpms.famillecol ...
- Python(3)
使用除法来缩减数字,使用余数法来计算个数. class Solution: def hammingWeight(self, n: int) -> int: count = 0 while Tru ...