1 条题解
-
0
题目大意
给定长度为 的序列 ,对于每个位置 有两个可能的取值:
- (石柱本身)
- (石柱的像)
求有多少区间 ()满足:存在正实数 ,使得可以给每个位置选择 或 ,构成严格递增序列。
关键观察
1. 约束条件分析
对于相邻位置 和 ,有四种选择组合:
- :要求
- :要求 ,即
- :要求 ,即
- :要求 ,即
2. 可行性条件
对于区间 ,我们需要检查是否存在 满足所有相邻位置的约束。
设 的可行范围为 ,初始为 。
对于每个相邻位置:
- 情况1:无条件(如果 )
- 情况2:
- 情况3:
- 情况4:无条件(如果 )
如果最终 ,则区间可行。
算法设计
双指针法
核心思想:对于每个起点 ,找到最大的 使得 可行,那么所有 都可行。
算法步骤:
- 初始化指针
- 对于每个 :
- 如果 ,则
- 不断尝试扩展 ,直到 不可行
- 答案加上 (即区间 都可行)
- 输出总答案
时间复杂度:,因为每个位置最多被左右指针各访问一次。
实现细节
1. 约束维护
我们需要维护当前区间 的 范围 。
当从 扩展到 时,只需检查新增的相邻对 的约束。
当左指针 右移时,需要删除 的约束影响。但直接删除比较困难,可以采用另一种方法:
2. 可行的实现方法
对于每个起点 ,重新计算从 开始的约束,利用之前的信息:
- 如果 可行,那么 很可能也可行
- 实际上,我们可以从 开始继续扩展,而不是从 重新开始
具体实现时,维护当前 和 ,当加入新位置时更新约束,如果 则停止扩展。
复杂度分析
- 时间复杂度:,每个位置最多被右指针访问一次
- 空间复杂度:,存储高度数组
总结
本题的关键在于:
- 将问题转化为关于 的不等式组
- 发现区间可行性的单调性质
- 使用双指针高效统计所有合法区间
通过维护 的可行范围,我们可以在 时间内解决该问题。
- 1
信息
- ID
- 3502
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 10
- 已通过
- 1
- 上传者