1 条题解
-
0
题意回顾
给定两个长度为 的序列 和 ,构造序列 :
- 恰有 个位置
- 最小化 ,其中 是 的最大子段和
数据范围:,。
关键观察
1. 问题转化
最大子段和 可能为正也可能为负。
我们要最小化 ,即:- 如果能使 ,答案就是
- 否则要最小化正的最大子段和
2. 初步思路
设 。
如果我们确定哪些位置选 (集合 ,),哪些选 (集合 ),则: $ c_i = \begin{cases} a_i & i \in A \\ a_i + d_i & i \in B \end{cases} $ 即 。
3. 最大子段和与选择的关系
最大子段和是序列上一个连续区间的和的最大值。
我们希望这个值尽量小(非正最好)。一个常用技巧:令 ,如果 的最大子段和 ,则 的最大子段和 。
所以可以二分答案 ,判断是否存在选择方案使得最大子段和 。
4. 二分答案框架
二分 ,检查是否存在恰选 个 的方案,使得 的任意子段和 。
等价于: 的最大子段和 。
判断可行性(给定 t)
1. 经典方法:前缀和约束
设 ,则子段和 。
最大子段和 等价于: $ \forall 0 \leq l < r \leq n,\quad p_r - p_{l-1} \leq t $ 即: $ \forall 0 \leq i < j \leq n,\quad p_j - p_i \leq t $ 这等价于: $ \max_{0 \le i \le n} p_i - \min_{0 \le i \le n} p_i \leq t $
2. 前缀和与选择的关系
$p_i = \sum_{j=1}^i a_j + \sum_{j=1}^i [j \in B] \cdot d_j$
设 (固定),(由选择决定)。则 。
条件变为: $ \max_{0 \le i \le n} (S_i + q_i) - \min_{0 \le i \le n} (S_i + q_i) \leq t $
3. 问题转化为:选择 B(大小 n-k)使 q 满足条件
, 是 ()的前缀和。
我们希望 。
进一步转化
设 ,。
条件 等价于:存在常数 使得: 即: 其中 。
4. 调整思路
我们其实可以控制 来让 的波动尽量小。
是某些 的和,。
解法
实际上,本题可以用更直接的贪心解法:
- 初始全选 (即 ,)
- 我们要从 中移出 个元素到 (即原本选 改成选 )
- 每次改变一个位置 从 到 , 的变化是
- 这会使所有包含 的子段和减少
- 为了最小化最大子段和,我们应优先选择 最大的位置进行切换(因为这样能最大程度降低正的最大子段和)
算法步骤
- 计算
- 按 从大到小排序
- 初始全选 ,计算此时的最大子段和
- 依次将 最大的 个位置改为选 ,重新计算最大子段和
- 取所有情况的最小
线性解法思路
实际上有 解法:
- 二分
- 用贪心判断:维护前缀和 ,当 时,必须将之前某个 改为 来降低前缀和,选择 最大的位置改
- 用堆维护可改的位置
最终算法()
- 二分
- 初始全选 ,前缀和 ,
- 用最大堆存当前可选的
- 从左到右扫描:
- 将 加入堆
- 如果 :
- 如果堆空或 ,则不可行
- 否则弹出堆顶 ,,
- 最后如果 则可行
这样可在 内检查一个 。
总结
本题的核心是:
- 二分答案
- 贪心维护前缀和不超过 ,通过将 改为 来降低前缀和
- 优先改 大的位置
- 时间复杂度 ,其中 是值域
通过二分答案和贪心选择,可以高效解决这个看似复杂的最优化问题。
- 1
信息
- ID
- 4461
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者