【YBTOJ】【CodeForces 372C】Watching Fireworks is Fun
时间:2021-08-08
本文章向大家介绍【YBTOJ】【CodeForces 372C】Watching Fireworks is Fun,主要包括【YBTOJ】【CodeForces 372C】Watching Fireworks is Fun使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Watching Fireworks is Fun
链接:
题目大意:
一个城镇有 \(n\) 个区域,从左到右 \(1\) 编号为 \(n\),每个区域之间距离 \(1\) 个单位距离。节日中有 \(m\) 个烟火要放,给定放的地点 \(a_i\),时间 \(t_i\),如果你当时在区域 \(x\),那么你可以获得 \(b_i - \vert a_i - x\vert\) 的开心值。你每个单位时间可以移动不超过 \(d\) 个单位距离。你的初始位置是任意的(初始时刻为 \(1\)),求你通过移动能获取到的最大的开心值。
正文:
考虑 DP,设 \(f_{i,j}\) 表示当前放第 \(i\) 个烟花且在位置 \(j\) 时的最大开心值。则有:
\[f_{i,j}=\max_{k,|j-k|\leq(t_i-t_{i-1})d}\left\{f_{i-1,k}+b_i-|a_i-j|\right\}
\]
考虑到可以将 \(b_i\) 提出,得到:
\[f_{i,j}=\max_{k,|j-k|\leq(t_i-t_{i-1})d}\left\{f_{i-1,k}-|a_i-j|\right\}
\]
我们可以用单调队列优化上面的式子。
最后答案为:
\[\sum_{i=1}^m b_i + \max_{i=1}^n\{f_{m,i}\}
\]
但是空间复杂度 \(\mathcal{O}(nm)\),用滚动数组优化至 \(\mathcal{O}(n)\) 即可。
代码:
const int N = 150010, M = 310;
inline ll Read()
{
ll x = 0, f = 1;
char c = getchar();
while (c != '-' && (c < '0' || c > '9')) c = getchar();
if (c == '-') f = -f, c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
return x * f;
}
int n, m, d;
ll f[2][N];
struct node
{
int a, t;
}a[M];
deque <int> q;
ll sum, ans = -(1ll << 60);
int main()
{
n = Read(), m = Read(), d = Read();
for (int i = 1; i <= m; i++)
a[i].a = Read(), sum += Read(), a[i].t = Read();
for (int i = 1; i <= m; i++)
{
ll len = (ll)(a[i].t - a[i - 1].t) * d;
for (; !q.empty(); q.pop_back());
for (int j = 1; j <= n; j++)
{
for (; !q.empty() && q.front() < j - len; q.pop_front());
for (; !q.empty() && f[i & 1 ^ 1][j] > f[i & 1 ^ 1][q.back()]; q.pop_back());
q.push_back(j);
f[i & 1][j] = f[i & 1 ^ 1][q.front()] - abs(a[i].a - j);
}
for (; !q.empty(); q.pop_back());
for (int j = n; j >= 1; j--)
{
for (; !q.empty() && q.front() > j + len; q.pop_front());
for (; !q.empty() && f[i & 1 ^ 1][j] > f[i & 1 ^ 1][q.back()]; q.pop_back());
q.push_back(j);
f[i & 1][j] = max(f[i & 1][j], f[i & 1 ^ 1][q.front()] - abs(a[i].a - j));
}
}
for (int i = 1; i <= n; i++)
ans = max(ans, f[m & 1][i]);
ans = sum + ans;
printf ("%lld", ans);
return 0;
}
原文地址:https://www.cnblogs.com/GJY-JURUO/p/15114916.html
- ASP.NET MVC集成EntLib实现“自动化”异常处理[实例篇]
- ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程
- 机器学习实战之决策树
- 初学ReactJS,写了一个RadioButtonList组件
- 今天,你有微信小游戏提交审核吗?
- 云计算,迷你版线程同步
- Kubernetes 年度关键进展回顾
- 比较一下以“反射”和“表达式”执行方法的性能差异
- 人工智能芯片是什么?有什么用?
- 柯洁食言“复出”再战AI:明年4月见分晓
- 深入探讨ASP.NET MVC的筛选器
- pytorch自然语言处理之Pooling层的句子分类
- su命令cannot set groups: Operation not permitted的解决方法
- 利用腾讯云 COS 云对象存储定时远程备份网站
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- jz2440重新分区
- 腾讯云TCB云函数趣应用:巧用 puppeteer 五分钟实现一个云加社区个人成就爬虫
- NFS挂载的2种方式
- Angular Component 开发时属性和运行时属性的对照
- 第002课 ubuntu环境搭建和ubuntu图形界面操作(免费)
- 爆破cobalt strike密码脚本
- 第003课 linux入门命令详解
- 第004课 vi编辑器的使用详解
- 【前端JQ】jQuery赋值checked的几种写法,attr()方法不好使,建议使用prop()方法。
- 达梦数据库适配问题
- Angular Component UI单元测试的隔离策略
- 第005课 linux进阶命令(文件查找,文件解压操作详解)
- 没有这 29 款插件的 Chrome 是没有灵魂的
- 第006课 开发板熟悉与体验
- Angular Observable数据类型的单元测试数据准备