LGP5653口胡

操作好像比较神秘。

发现 \(k\) 很小,考虑和 \(k\) 有关的 DP,考虑不出来。

费用提前计算,对 \(w_i\) 做后缀和,那么序列的权值就是 \(\sum_{i=1}^nyw_i\)。

考虑 DP,明显有 \(dp[n][x]=\max_{i=-k}^kdp[n-1][x+i]+i\times w_n\)。

注意到这个形式有点像 \((\max,+)\) 卷积,很容易发现右边的东西是一个一次函数。

一次函数一定是一个凸包,所以 DP 数组一定也是一个凸包。

我们需要计算的就是两个凸包的闵可夫斯基和。闵可夫斯基和是将两个凸包的点按照斜率归并起来。

注意到一次函数的斜率都相同,在归并的时候可以视作将一段连续的点插入凸包。

然后因为 \(b_i\leq a_i\),每次操作结束后需要删掉一个后缀。

上述操作使用平衡树可以做到 \(O(n\log n)\),可以通过。

上一篇:最长公共子序列


下一篇:Java判断文件存在不存在