【单调队列优化】[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股 且一次 ...
随机推荐
- CF322F
CF322F 拉格朗日插值 #include<iostream> #include<cstdio> #include<algorithm> #include< ...
- ReentrantLock的相关方法使用
获取锁定 void lock():常用获取锁定的方法 void lockInterruptibly():如果当前线程未被中断,则获取锁定:如果当前线程被中断,则出现异常 boolean tryLock ...
- LeetCode Array Easy 119. Pascal's Triangle II
Description Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's tria ...
- C# 连接Excel,获取表格数据,获取多个sheet中的数据,获取多个sheet名
/// <summary> /// 获取Excel内容. /// </summary> /// <param name="sheetName"> ...
- postgresql like 中的转义
select * from tb_org where char_length(xdm)>8 and xdm not like '%*_%' ESCAPE '*' ESCAPE 后面的 * 是转 ...
- Shell 变量的分类
- texindex - 对 Texinfo 索引文件排序
SYNOPSIS 总览 texindex [OPTION]... FILE... DESCRIPTION 描述 为每个 Tex 输出文件 FILE 产生一个已排序的索引.通常对于文档 `foo.tex ...
- Apache Hadoop集群离线安装部署(二)——Spark-2.1.0 on Yarn安装
Apache Hadoop集群离线安装部署(一)——Hadoop(HDFS.YARN.MR)安装:http://www.cnblogs.com/pojishou/p/6366542.html Apac ...
- 【LeetCode 21】合并两个有序链表
题目链接 [题解] 就是归并排序的一趟合并操作. 新建个链表加在上面就好.(用原来的链表的头结点也没问题) 加个头结点会比较好操作一点. 返回的时候返回头结点的next域就行 [代码] /** * D ...
- Android中对TextView中的部分内容的字体样式的设置方法
Android中的TextView中内容,有时候需要对其部分内容添加下划线和颜色操作: String str = "回复 " + uname + " 的评论: " ...