题解-------CF372C Watching Fireworks is Fun
一道有趣的DP
题目大意
城镇中有$n$个位置,有$m$个烟花要放。第$i$个烟花放出的时间记为$t_{i}$,放出的位置记为$a_{i}$。如果烟花放出的时候,你处在位置$x$,那么你将收获$b_{i}- \left | a_{i}-x \right |$点快乐值。
初始你可在任意位置,你每个单位时间可以移动不大于$d$个单位距离。现在你需要最大化你能获得的快乐值。
思路:DP+单调队列+滚动数组
有一个显然的动态转移方程:
$f_{i,j}=max \left (f_{i,j},f_{i-1,k}+b_{i}- \left |a_{i}-j \right | \right )$
$f_{i,j}$表示在位置$j$放第$i$个烟花获得的最大值。
则$ans=max_{i=1}^{n}f_{m, i}$。
观察方程,可以看出$b_{i}$可以提出来,而$- \left |a_{i}-j \right |$的值在计算的过程中也是确定的,也可提出来。
最后的式子长这个样子
$f_{i,j}=min \left (f_{i,j},f_{i-1,k} \right )$
$ans=sum_{i=1}^{m}b_{i}-min_{i=1}^{n}f_{m, i}$
感觉可以,一看复杂度$O \left ( n^{2}m \right )$,T到飞起。
从上式中,可以看出$k$的范围是
$j- \left ( t_{i}-t_{i-1} \right ) *d \leq k \leq j+ \left ( t_{i}-t_{i-1} \right ) *d$
如何维护$k$的值?很明显,用单调队列维护,使得其能在均摊$0 \left (1 \right )$的时间复杂度内计算出$min \left (f_{i,j},f_{i-1,k} \right )$,没学的赶快学。
于是复杂度从$O \left ( n^{2}m \right )$降到了$O \left ( nm \right )$。
一看范围,150000。。。直接爆炸。
仔细观察,发现可以用滚动数组优化空间,能过。
代码
#include <iostream> #define RI register int
typedef long long ll;
const int N = 150001; using namespace std; template <class T>
inline void read(T &x) {
T f = 1; x = 0; char c = getchar();
while(c > '9' || c < '0') {
if(c == '-')
f = -f;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
x *= f;
} int n, m, d, t[2];
ll f[2][N], ans = 1e18 + 7, sum;
int l, r, q[N];
int p; inline int abs(int x) {
return x > 0 ? x : -x;
} inline ll min(ll x, ll y) {
return x > y ? y : x;
} int main() {
read(n), read(m), read(d);
for(RI i = 1; i <= m; i++) {
int a, b;
read(a), read(b), read(t[p ^ 1]);
sum += b;
ll len = ll(t[p ^ 1] - t[p]) * d;
l = 1, r = 0;
for(RI j = 1; j <= n; j++) {
while(l <= r && q[l] < j - len)
l++;
while(l <= r && f[p][q[r]] > f[p][j])
r--;
q[++r] = j;
f[p ^ 1][j] = f[p][q[l]] + abs(a - j);
}
l = 1, r = 0;
for(RI j = n; j >= 1; j--) {
while(l <= r && q[l] > j + len)
l++;
while(l <= r && f[p][q[r]] > f[p][j])
r--;
q[++r] = j;
f[p ^ 1][j] = min(f[p][q[l]] + abs(a - j), f[p ^ 1][j]);
}
p ^= 1;
}
for(RI i = 1; i <= n; i++)
ans = min(ans, f[p][i]);
printf("%lld\n", sum - ans);
return 0;
}
题解-------CF372C Watching Fireworks is Fun的更多相关文章
- 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 ...
- 【简洁易懂】CF372C Watching Fireworks is Fun dp + 单调队列优化 dp优化 ACM codeforces
题目大意 一条街道有$n$个区域. 从左到右编号为$1$到$n$. 相邻区域之间的距离为$1$. 在节日期间,有$m$次烟花要燃放. 第$i$次烟花燃放区域为$a_i$ ,幸福属性为$b_i$,时间为 ...
- 【单调队列优化】[CF372C] Watching Fireworks is Fun
突然发现我可能单调队列都打不来了...我太菜了... 这道题显然有$$f[i][j]=min\{f[i-1][k]+\vert j-a[i] \vert\}$$ 则$ans=\sum_{i=1}^{m ...
- 单调队列+线性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 ...
- F - Watching Fireworks is Fun
C. Watching Fireworks is Fun 题目大意: 一个城镇有n个区域,从左到右1-n,每个区域之间距离1个单位距离.节日中有m个烟火要放,给定放的地点a[ i ].时间t[ i ] ...
- 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 ...
- DP 优化方法合集
0. 前言 写完这篇文章后发现自己对于 DP 的优化一窍不通,所以补了补 DP 的一些优化,写篇 blog 总结一下. 1. 单调队列/单调栈优化 1.2 算法介绍 这应该算是最基础的 DP 优化方法 ...
随机推荐
- UVA - 1615 Highway(高速公路)(贪心+区间选点)
题意:给定平面上n(n<=105)个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个点,都有一个选出的点离它的欧几里德距离不超过D. 分析: 1.根据D可以算出每个点在x轴上的可选区 ...
- POJ 3368:Frequent values
Frequent values Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14764 Accepted: 5361 ...
- JVM探秘:MAT分析内存溢出
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. MAT是分析Java堆内存的一个工具,全称是 The Eclipse Memory A ...
- php-fpm启动 关闭 重启
http://www.cnblogs.com/GaZeon/p/5421906.html 最近安装了mysqli扩展,重启了nginx后,phpinfo()没有显示出mysqli,后来搞不出原因,直接 ...
- NumPy - 数组(定义,拼接)
NumPy 教程(数组) set_printoptions(threshold='nan') NumPy的数组中比较重要ndarray对象属性有: ndarray.ndim:数组的维数(即数组轴的个数 ...
- XML--XSL
参考 http://blog.51cto.com/cnn237111/1345998 https://www.w3.org/TR/2017/REC-xslt-30-20170608/ 声明 把文档声明 ...
- cors跨域和jsonp劫持漏洞 和 同源策略和跨域请求解决方案
cors跨域和jsonp劫持漏洞: https://www.toutiao.com/a6759064986984645127/ 同源策略和跨域请求解决方案:https://www.jianshu.co ...
- Jshint 安装方法
首先在编辑器中搜索扩展程序 "Jshint" 并安装,安装成功后 打开Javascript文件会出现报错提示: "Failed to load jshint librar ...
- C语言笔记 15_标准库&locale&math&setjmp&signal&stdarg&stddef
<locale.h> 简介 locale.h 头文件定义了特定地域的设置,比如日期格式和货币符号.接下来我们将介绍一些宏,以及一个重要的结构 struct lconv 和两个重要的函数. ...
- 在java中如何根据手机号查询号码归属地
1.maven项目中配置 <dependency><groupId>com.googlecode.libphonenumber</groupId><artif ...