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 ...
随机推荐
- tf.get_variable
使用tf.get_variable()时,如果检测到命名冲突,系统不会处理冲突,而会报错. 如果已经创建的变量对象,就把那个对象返回,如果没有创建变量对象的话,就创建一个新的. tf.get_vari ...
- WinForm:API
一.WndProc: 主要用在拦截并处理系统消息和自定义消息 比如:windows程序会产生很多消息,比如你单击鼠标,移动窗口都会产生消息.这个函数就是默认的消息处理函数.你可以重载这个函数来制定自 ...
- 别人用钱,而我用python爬虫爬取了一年的4K高清壁纸
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...
- Eugene and an array CodeForces - 1333C (思维)
题目大意:求好数组的个数,所谓好数组 1好数组是原数组的一段连续的子数组,2 好数组不包含元素和为0的子数组. 题解:唉,这个题目把我给些懵了....我一开始的想法求后缀和,保存位置,然后枚举前缀和, ...
- Android内存优化—dumpsys meminfo详解
原创置顶 不死鸟JGC 最后发布于2018-12-24 14:19:28 阅读数 3960 收藏展开dumpsys 介绍Dumpsys用户系统诊断,它运行在设备上,并提供系统服务状态信息 命令格式: ...
- 用Java代码来校验QQ号
校验qq号码: 1.要求必须是5-15位数字 2.0不能开头 分析: A:键盘录入一个qq号码 B:写一个功能实现校验 C:调用功能,输出结果. 代码实现:public class RegexDemo ...
- 数字签名---RSA算法
保证信息在传输过程中的安全性: 保密通信.密钥交换.数字签名. RSA算法 Diffie-Hellman算法 DSA算法 保密通信 √ × × 密钥交换 √ √ × 数字签 ...
- CountDownLatch/CyclicBarrier/Semaphore
CountDownLatch 概念 让一些线程阻塞直到另一些线程完成一系列操作才被唤醒 CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程就会被阻塞.其它线程调 ...
- [wp]xctf newscenter
手工注入 查询所有数据库名称和表名 ' union select 1,table_schema,table_name from information_schema.tables# 发现就两个数据库i ...
- iconv 参数详解
参数详解: $row [] = iconv('utf-8', 'GB2312//IGNORE', $value['message']); iconv ( string $in_charset , st ...