博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「2019冬令营提高组」全连
阅读量:4698 次
发布时间:2019-06-09

本文共 1321 字,大约阅读时间需要 4 分钟。

显然的 $dp$

设 $f[i]$ 表示点击第 $i$ 个音符时的最大价值,$t[i]$ 表示音符 $i$ 的准备时间

那么可以枚举 $1$ 到 $i-t[i]$ 的所有音符,如果  $j$ ,如果 $j+t[j]$ 小于等于 $i$ ,那么 $f[i]=max(f[i],f[j]+t[i]*val[i])$

考虑优化转移

显然如果 $i$ 在时间 $k$ 时可以转移,那么后面所有的时间也都能转移

考虑用树状数组维护前缀最大值,用 $vector$ 维护时间 $k$ 时恰好可以转移的 $f$

那么每次到一个位置就把可以转移的 $f$ 插到树状数组,然后查询最大值转移

复杂度 $O(nlog_n)$,注意 $long\ long$

#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f;}const int N=1e6+7;int n,t[N],val[N];ll T[N],f[N],ans;inline void ins(int x,ll y) { while(x<=n) T[x]=max(T[x],y),x+=(x&-x); }inline ll query(int x) { ll res=0; while(x) res=max(res,T[x]),x-=(x&-x); return res; }vector
v[N];int main(){ freopen("fc.in","r",stdin); freopen("fc.out","w",stdout); n=read(); for(int i=1;i<=n;i++) t[i]=read(); for(int i=1;i<=n;i++) val[i]=read(); for(int i=1;i<=n;i++) { int len=v[i].size(); for(int j=0;j
t[i] ? query(i-t[i]) : 0); if(i+t[i]<=n) v[i+t[i]].push_back(i); ans=max(ans,f[i]); } printf("%lld",ans); return 0;}

 

转载于:https://www.cnblogs.com/LLTYYC/p/10490457.html

你可能感兴趣的文章
Git Stash用法
查看>>
sql server 2008学习8 sql server存储和索引结构
查看>>
Jquery radio选中
查看>>
postgressql数据库中limit offset使用
查看>>
测试思想-集成测试 关于接口测试 Part 2
查看>>
php生成器使用总结
查看>>
T-SQL中的indexof函数
查看>>
javascript基础之数组(Array)对象
查看>>
mysql DML DDL DCL
查看>>
RAMPS1.4 3d打印控制板接线与测试1
查看>>
python with语句中的变量有作用域吗?
查看>>
24@Servlet_day03
查看>>
初级ant的学习
查看>>
memcached 细究(三)
查看>>
RSA System.Security.Cryptography.CryptographicException
查看>>
webservice整合spring cxf
查看>>
[解题报告] 100 - The 3n + 1 problem
查看>>
Entity Framework 学习高级篇1—改善EF代码的方法(上)
查看>>
Mybatis逆向工程配置文件详细介绍(转)
查看>>
String类的深入学习与理解
查看>>