1 条题解
-
0
题意回顾
有 个士兵排成一排,技能值为 。
要选择若干不相交的长度为 的连续区间,最大化技能值总和。
有 次询问,每次给定区间 ,求只在该区间内选择的最大总和。数据范围:,。
关键观察
1. 问题转化
选择长度为 的不相交区间,相当于在序列上选择一些位置 ,使得区间 不相交,最大化这些区间的和。
设 (区间和),则问题转化为:选择不相邻的 (因为区间不能重叠),最大化总和。
线段树解法
定义状态
设 表示以位置 为最后一个区间起点时的最大总和。
则:
维护前缀最大值 ,则:
处理区间查询
对于查询 ,我们只考虑起点在 的区间。
用线段树维护区间内 的最大值,支持区间查询。
最终算法
预处理
- 计算所有
- 用前缀和计算:
在线处理查询
对每个查询 :
- 有效起点范围:
- 如果 ,答案为 (无法选任何区间)
- 否则用线段树查询 内 的最大值
更新策略
从左到右处理位置 :
- 如果 :(只能选一个区间)
- 否则:
- 用线段树维护 数组,支持区间最大值查询和单点更新
复杂度分析
- 预处理 :
- 线段树建树:
- 每个查询:
- 总复杂度:,可过
边界情况
- 当 时,问题退化为选择若干不相邻的数使和最大
- 当区间长度 时,答案为
- 所有 都为负数时,最优解为 (不选任何区间)
总结
本题的核心解法:
- 将问题转化为选择不相邻的定长区间和
- 使用动态规划计算最优解
- 用线段树维护区间最大值以支持任意区间查询
- 时间复杂度 ,可处理大规模数据
通过动态规划和数据结构结合,高效解决了带区间约束的最优选择问题。
- 1
信息
- ID
- 4553
- 时间
- 7000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 7
- 已通过
- 1
- 上传者