Description
题目链接:BZOJ 1911
你有一支由 $n$ 名预备役士兵组成的部队,士兵从 $1$ 到 $n$ 编号,要将他们拆分 成若干特别行动队调入战场。出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如 $(i,i+1,\dots,i+k)$ 的序列。 编号为 $i$ 的士兵的初始战斗力为 $x_i$ ,一支特别行动队的初始战斗力 $x$ 为队内 士兵初始战斗力之和,即 $x=x_i+x_{i+1}+\cdots+x_{i+k}$。
通过长期的观察,你总结出一支特别行动队的初始战斗力 $x$ 将按如下经验公 式修正为 $x’$:$x’= ax^2+bx+c$,其中 $a,b,c$ 是已知的系数($a<0$)。 作为部队统帅,现在你要为这支部队进行编队,使得所有特别行动队修正后战斗力之和最大。试求出这个最大和。
数据范围:$1\le n\le 10^6$,$-5\le a\le -1$,$\vert b\vert,\vert c\vert\le 10^7$,$1\le x_i\le 100$
Solution
我们先列出一个朴素的 $\text{DP}$ 方程,定义 $f_i$ 表示考虑到第 $i$ 个人时的战斗力之和的最大值,记 $sum_i=\sum_{k=1}^i x_k$,那么转移方程为:
直接转移的复杂度是 $O(n^2)$ 的,由于有平方项考虑斜率优化。
根据套路,我们任取 $j,k$ 且 $0\le k<j<i$,如果 $j$ 比 $k$ 更优,那么有:
整理得到(注意题目中保证 $a<0$):
我们发现,不等式左边是单调递减的,右边分母上的前缀和是单调递增的。
那么我们用单调队列维护一个上凸壳,斜率递减且均小于当前的 $2a\cdot sum_i$,每次的最优决策就是队首。
时间复杂度:$O(n)$
Code
1 |
|