1 条题解
-
0
问题分析
本题是一道结合区间动态规划与线段树优化的复杂问题,核心任务是在给定约束条件下,计算区间选择的最大收益。问题涉及区间覆盖、资源消耗和收益最大化,需要高效处理大量区间操作和查询。
算法思路
1. 问题建模与预处理
- 核心要素:每个区间操作包含左端点
l、右端点r和价值v,选择区间会获得v的收益,但需消耗与区间长度相关的成本(成本系数为-d)。 - 离散化:将所有区间的
l-1和r收集后排序去重,得到离散化数组b,用于压缩坐标空间,减少计算量。离散化后坐标数量为tot,满足tot = O(m)(m为区间数量)。
2. 线段树设计与操作
- 线段树功能:维护区间内的最大收益值,支持区间更新(添加价值)和区间查询(获取最大值)。
- 特殊更新策略:通过
pu函数实现延迟更新,将父节点的增值分摊到子节点,确保查询时能正确获取区间最大值。 - 区间更新:
add(l, r, v)函数向[l, r]区间内所有元素添加v,时间复杂度O(log M)(M = 2^18为线段树大小)。 - 区间查询:
ask(l, r)函数查询[l, r]区间内的最大值,时间复杂度O(log M)。
3. 动态规划与状态转移
- 状态定义:
f[i]表示处理到离散化坐标b[i]时的最大收益。 - 转移逻辑:
- 按右端点排序所有区间,依次处理每个离散化坐标
b[i]。 - 对于当前坐标
b[i],将所有右端点≤ b[i]的区间加入线段树(通过add函数更新区间价值)。 - 计算可选择的区间范围
[L, R],其中L是b[i] - k对应的离散化坐标,R = i-1(确保区间长度不超过k)。 - 状态转移:
f[i+1] = max(f[i+1], ask(L, R) + b[i] * d),其中d为成本系数(负值表示消耗)。 - 保持最大值:
f[i] = max(f[i], f[i-1]),确保不选择任何区间时收益不下降。 - 更新线段树:将当前
f[i]对应的价值f[i] - b[i] * d添加到线段树中,供后续状态查询。
- 按右端点排序所有区间,依次处理每个离散化坐标
4. 结果计算
最终结果为所有
f[i]的最大值,即max(res, f[tot]),表示在所有离散化坐标中能获得的最大收益。关键公式与复杂度
- 离散化映射:将原始坐标映射到
[1, tot],压缩空间并减少计算量。 - 收益计算:选择区间
[l, r]的净收益为v + d * (r - l + 1),其中d为负的成本系数。 - 状态转移公式:$$f[i+1] = \max(f[i+1], \text{ask}(L, R) + b[i] \times d)
$$其中
ask(L, R)是区间[L, R]内的最大收益,b[i] \times d是当前坐标的成本。 - 时间复杂度:
- 离散化:
O(m log m) - 区间排序:
O(m log m) - 动态规划与线段树操作:
O(tot log M + m log M),其中tot = O(m),M = 2^18 - 总复杂度:
O(m log m + m log M),适合处理m ≤ 10^5的规模
- 离散化:
代码解析
模块 功能描述 离散化 收集并排序区间端点,压缩坐标空间 线段树 实现区间更新和最大值查询,支持延迟更新 动态规划 按离散化坐标依次处理,通过线段树高效查询和更新状态 主函数 读取输入,初始化数据结构,调用核心算法并输出结果 算法的核心是通过离散化减少坐标范围,利用线段树优化区间查询和更新,将原本
O(n^2)的动态规划优化为O(m log m),高效解决了区间选择的收益最大化问题。 - 核心要素:每个区间操作包含左端点
- 1
信息
- ID
- 3602
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者