全连
- (nleq 10^6) ,保证答案在 (long long) 范围内.
比较浅显的(dp ?) 记 (f[i]) 表示考虑前 (i) 个音符,其中第 (i) 个被钦定选择,答案就是 (max f[i]).- 转移: (f[i]=val[i]+max f[j],j<i,jleq i-t[i],j+t[j]leq i). 暴力转移是 (O(n^2)) 的.
- 转移有三个限制条件,第一个直接通过处理顺序解决,只有后两个需要考虑.如果把 (j,t[i]+j) 看做两维,显然可以用一棵主席树来维护.可惜这样做空间会爆掉.
- 仔细观察,最后一个条件 (j+t[j] leq i) 是有单调性的,若一个 (j) 对当前的 (i) 合法,那么它对后面的所有 (i) 都合法.
- 用一个堆记录一下还未产生贡献的 ((j,t[j]+j)) ,当前满足 (j+t[j]leq i) 时就让它产生贡献.
- 这样就只用在 (jleq i-t[i]) 中找最大值,用 (Fenwick-tree) 维护一下就可以了.时间复杂度为 (O(nlogn)) .