题面
给定长度为 \(n\) 的数列 \(\{a_i\}\) 和两个参数 \(k, s\),将 \(\{a_i\}\) 划分成 \(k\) 段,最大化 和 \(\geq s\) 的段数。
\(1 \leq k \leq n \leq 250000, 1 \leq A_i \leq 10^9, 1 \leq s \leq 10^{15}\)。
题解
首先注意到如果当前划分的一段 \(sum<s\) ,那么这种段的长度肯定是 \(1\) 。
那么我们就只考虑 \(sum\ge s\) 的段,我们就可以把原问题转化为:我要在原序列中选择 \(m\) 个区间(区间和划分段是等价的),满足以下条件,问 \(m\) 最大是多少。
- 每一个区间的 \(sum\ge s\)
- 选出的区间不能有交
- 记一个选出来的区间的代价为 \(len-1\) ,那么代价和要小于 \(n-k\)
注意随着你选的区间增加,代价肯定是越来越大的,也就是记 \(f(x)\) 表示选 \(x\) 个区间的最小代价,\(f(x)\) 是上凹的(证明可以看官方题解)
所以可以用wqs二分!
但我们一般用wqs二分是来找到 \((x,f(x))\) 的值,这里是要找到 \(\max(x|f(x)\le n-k)\) ,可以用吗?
当然可以,我们只要二分斜率 \(mid\) ,找到切点,看切点的 \(f(x)\) 大于还是小于 \(n-k\) ,若大于,则 \(mid\) 太大了,切到的点在我们想要的 \(x\) 点的右边了,反之亦然。
于是我就可以求出答案了(要注意 \(K_{x,x+1}\) 与 \(K_{x-1,x}\) 相等的情况,需要做一些处理 )复杂度就是 \(O(n\log n)\) 。
启发
- 一种全新的wqs二分运用形式!
- 原问题的转化也值得留意。