【单调队列优化】[CF372C] Watching Fireworks is Fun
突然发现我可能单调队列都打不来了...我太菜了...
这道题显然有$$f[i][j]=min\{f[i-1][k]+\vert j-a[i] \vert\}$$
则$ans=\sum_{i=1}^{m} b_i - min_{j=1}^{n}\{f[m][j]\}$
令$len=(t[i]-t[i-1])*d$则其中k满足$$k∈[j-len,j+len]$$
$f[i][]$只与$f[i-1][]$有关,所以可以把第一维压掉
不难弄出一个$O(n^2m)$的代码:
#include<bits/stdc++.h>
#define int long long
#define writeln(x) write(x),puts("")
#define writep(x) write(x),putchar(' ')
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}void write(int x){
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}const int M = ;
int f[][M],n,m,d,ans=0x3f3f3f3f,sum;
struct P{int a,b,t;}a[M];
signed main(){
n=read(),m=read(),d=read(),sum=;
for(int i=;i<=m;i++){
int x=read(),y=read(),z=read();
sum+=y;
a[i]=(P){x,y,z};
}
for(int i();i<=n;i++)f[][i]=abs(a[].a-i);
for(int i();i<=m;i++){
memset(f[i&],0x3f,sizeof(f[i&]));
int len=(a[i].t-a[i-].t)*d;
for(int j=;j<=n;j++){
for(int k=max(1ll,j-len);k<=min(j+len,n);k++)
f[i&][j]=min(f[i&][j],f[i&^][k]+abs(a[i].a-j));
if(i==m)ans=min(ans,f[i&][j]);
}
}
cout<<sum-ans<<endl;
return ;
}
但是显然会T,注意到上面k的范围,可以考虑单调队列优化,对于每一次的$i,j$,对$[j-len,j]$跑一次滑动窗口,对$[j,j+len]$跑一次滑动窗口取最小值即可
#include<bits/stdc++.h>
#define int long long
#define writeln(x) write(x),puts("")
#define writep(x) write(x),putchar(' ')
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}void write(int x){
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}const int M = ;
int f[][M],n,m,d,ans=0x3f3f3f3f,sum,q[M];
struct P{int a,b,t;}a[M];
signed main(){
n=read(),m=read(),d=read(),sum=;
for(int i=;i<=m;i++){
int x=read(),y=read(),z=read();
sum+=y;a[i]=(P){x,y,z};
}for(int i();i<=n;i++)f[][i]=abs(a[].a-i);
for(int i();i<=m;i++){
int len=(a[i].t-a[i-].t)*d,l=,r=;
for(int j=;j<=n;j++){
while(l<=r&&q[l]<j-len)++l;
while(l<=r&&f[i&^][q[r]]>f[i&^][j])--r;
q[++r]=j;
f[i&][j]=f[i&^][q[l]]+abs(j-a[i].a);
if(i==m)ans=min(ans,f[i&][j]);
}l=,r=;
for(int j=n;j>=;j--){
while(l<=r&&q[l]-len>j)++l;
while(l<=r&&f[i&^][q[r]]>f[i&^][j])--r;
q[++r]=j;
f[i&][j]=min(f[i&][j],f[i&^][q[l]]+abs(j-a[i].a));
if(i==m)ans=min(ans,f[i&][j]);
}
}cout<<sum-ans<<endl;
return ;
}
【单调队列优化】[CF372C] Watching Fireworks is Fun的更多相关文章
- 【简洁易懂】CF372C Watching Fireworks is Fun dp + 单调队列优化 dp优化 ACM codeforces
题目大意 一条街道有$n$个区域. 从左到右编号为$1$到$n$. 相邻区域之间的距离为$1$. 在节日期间,有$m$次烟花要燃放. 第$i$次烟花燃放区域为$a_i$ ,幸福属性为$b_i$,时间为 ...
- BestCoder Round #89 02单调队列优化dp
1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01 HDU 5944 水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
- UESTC 880 生日礼物 --单调队列优化DP
定义dp[i][j]表示第i天手中有j股股票时,获得的最多钱数. 转移方程有: 1.当天不买也不卖: dp[i][j]=dp[i-1][j]; 2.当天买了j-k股: dp[i][j]=max(dp[ ...
- poj 1821 Fence 单调队列优化dp
/* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...
- 使用单调队列优化的 O(nm) 多重背包算法
我搜索了一下,找到了一篇很好的博客,讲的挺详细:链接. 解析 多重背包的最原始的状态转移方程: 令 c[i] = min(num[i], j / v[i]) f[i][j] = max(f[i-1][ ...
- hdu3401:单调队列优化dp
第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...
随机推荐
- CF1223D
CF1223D 不需要动的一定值域连续 #include<iostream> #include<cstring> #include<cstdio> #include ...
- Java中File类创建文件
只需要调用该类的一个方法createNewFile(),但是在实际操作中需要注意一些事项,如判断文件是否存在,以及如何向新建文件中写入数据等. import java.io.*; public cla ...
- Node.js中的fs文件系统
fs.stat 检测是文件还是目录 fs.mkdir 创建目录 fs.writeFile 创建写入文件 fs.appendFile 追加文件 fs.readFile 读取文件 fs.readdir 读 ...
- swapon, swapoff - 使用/关闭用于分页和交换的文件和设备
总览 (SYNOPSIS) /sbin/swapon [-h -V] /sbin/swapon -a [-v] /sbin/swapon [-v] [-p priority] specialfile ...
- JNI原理与静态、动态注册
前言 JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层.这一个系列我们来一起深入学习JNI. ...
- zookeeper常用配置详解
#ZK中的一个时间单元.ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的.例如,session的最小超时时间是2*tickTime tickTime=2000 #Follower在启动过程中, ...
- 前端学习(十)初识js(笔记)
js事件(公有属性) onclick="" 当点击...时! onmouseover="" 当鼠标移入...时!onmouseout="" ...
- koa2 使用 async 、await、promise解决异步的问题
koa代码编写上避免了多层的嵌套异步函数调用 async await来解决异步 - async await 需要依赖于promise 三主角: __函数前面 async, 内部才能await,要想aw ...
- 【dart学习】-- Dart之函数
1. 指定返回值得函数 /** * 无返回值的函数 * params: 可以是任意类型(var和Object类型也可以任意类型). 当然这里的参数类型你可以随意指定我这里已dynamic为例 * 参数 ...
- delphi 给程序加托盘图标
一些程序运行时,会在桌面的右下角显示一个图标(任务栏的右边),这类图标称为 托盘.托盘是一个PNotifyIconDataA类型的结构,要增加托盘图标其实就是对结构PNotifyIconDataA的操 ...