题意:
一个有 $n$ 个数的序列,要求找出 $k$ 个长度不小于 $L$ 且不大于 $R$ 的区间,使得它们所对应的区间内数的和最大。
我们的策略肯定是先取最大的,再取次大的,依次类推。
设 $g_{f,l,r}$ 表示左断点为 $f$,右端点在 $[l,r]$ 内的最大值
这个最大值就是 $\max\{sum_x-sum_{f-1}\}(l \leq x \leq r)$
(这里有一个前缀和很容易能看出来)
先考虑 $f$ 一定的情况
把 $sum_{f-1}$ 提出来就是 $\max\{sum_x\}(l \leq x \leq r) - sum_{f - 1}$
现在我们就只用关心 $\max\{sum_x\}(l \leq x \leq r)$
这个用ST表随便搞搞就行
设这个最大值的位置在 $p$ 处取到,
那么次大值可能在 $[l,p-1]$ 或 $[p+1,r]$ 中取到
这个地方用堆随便维护一下就行
然而现在 $f$ 不一定,但我们还是能用堆乱搞维护一下,每次取出一个区间再放回去两个区间
题解写的我自己都看不懂了,或许代码更容易让人理解
1 |
|