当决策单调与WQS二分结合.
题意
给 $n$ 条贞鱼与每对贞鱼之间的怨气值 求分成 $K$ 段,每段的怨气值之和的最小值.
$1 \leq n \leq 4000, 1 \leq k \leq min(n,800)$
思路
先想朴素的 $dp$.不难想到这个 $O(n^2k)$ 的转移
其中 $calc(i,j)$ 利用前缀和做一下就好了.显然跑不过去.
类似 $JSOI2011 Lemon$ ,假设有 $k < j \leq i$ ,我们发现如果有 $j$ 在某个时刻比 $k$ 优秀那么它永远比 $k$ 优秀.因为$f[j] + calc(j,i) > f[k] + calc(k,i)$ , $f[j] - f[k] > calc(k,i) - calc(j,i) > 0$
但是不能斜率优化 因为右边的式子在换了决策点之后 并不一定单调.
搞一个单调队列 又是类似 $JSOI2011 Lemon$ ,保证更优秀的答案出现的时间单调 每次二分去找.
然后我们成功优化到了 $O(nlognk)$
发现还是过不去 为什么呢
读入太大了
再考虑一个优化 观察到这里的限制是恰好 $K$ 段
用 $WQS$ 二分的套路 每次选一段的时候加一个怨气值 记录最后选了几段.
发现如果这个附加怨气值越小的话对于固定的 $i$ 总段数越大.
然后答案还原影响就可以了.
注意二分的边界 这玩意不是一般的坑
Code
1 | //Keep pluggin',this is your only outlet. |