【单调队列优化】[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股 且一次 ...
随机推荐
- CentOS 7 安装 nginx1.15
1,安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel SSL功能需要openssl库 gzip模块需要z ...
- cordova 配置 高德地图sdk定位
获取 sha1 打开 cmd 1. cd .android 2. keytool -list -v -keystore debug.keystore 3. 输入密钥: android 4. 复制 sh ...
- Ti 949 配置 948 i2c
如果不想用 远端 slave,只访问948 选 i2c pass through all =1 :i2c pass through =0/1 0x0c 0x17 0x9e 如果想用远端 sla ...
- 单核cpu实现多任务原理
- javascript实现获取指定精度的上传文件的大小简单实例
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- vue-element-admin打包后白屏的问题
publicPath: './',
- python的代码块缓存机制,小数据池机制。
同一代码块的缓存机制 在python中一个模块,一个函数,一个类,一个文件等都是一个代码块. 机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其 ...
- SQL生成 C# Model
本文转自: https://www.cnblogs.com/jhli/p/11552105.html declare @TableName sysname = 'T_FakeOrderList' de ...
- c#网络通信框架networkcomms内核解析之三 消息同步调用
networkcomms.net 来自英国的网络通信框架 官方网址 www.networkcomms.net 中文网址www.networkcomms.cn 客户端发送消息给服务器,服务器计算结果返回 ...
- ( 转)WPF面板布局介绍Grid、StackPanel、DockPanel、WrapPanel
回顾 上一篇,我们介绍了基本控件及控件的重要属性和用法,我们本篇详细介绍WPF中的几种布局容器及每种布局容器的使用场景,当 然这些都是本人在实际项目中的使用经验,可能还存在错误之处,还请大家指出. 本 ...