1 条题解

  • 0
    @ 2025-10-19 21:21:10

    题目大意

    给定长度为 nn 的序列 h1,h2,,hnh_1, h_2, \dots, h_n,对于每个位置 ii 有两个可能的取值:

    • hih_i(石柱本身)
    • hi=2Lhih'_i = 2L - h_i(石柱的像)

    求有多少区间 [u,v][u, v]1u<vn1 \le u < v \le n)满足:存在正实数 LL,使得可以给每个位置选择 hih_ihih'_i,构成严格递增序列。


    关键观察

    1. 约束条件分析

    对于相邻位置 iii+1i+1,有四种选择组合:

    1. (hi,hi+1)(h_i, h_{i+1}):要求 hi<hi+1h_i < h_{i+1}
    2. (hi,hi+1)(h_i, h'_{i+1}):要求 hi<2Lhi+1h_i < 2L - h_{i+1},即 L>hi+hi+12L > \frac{h_i + h_{i+1}}{2}
    3. (hi,hi+1)(h'_i, h_{i+1}):要求 2Lhi<hi+12L - h_i < h_{i+1},即 L<hi+hi+12L < \frac{h_i + h_{i+1}}{2}
    4. (hi,hi+1)(h'_i, h'_{i+1}):要求 2Lhi<2Lhi+12L - h_i < 2L - h_{i+1},即 hi>hi+1h_i > h_{i+1}

    2. 可行性条件

    对于区间 [u,v][u, v],我们需要检查是否存在 L>0L > 0 满足所有相邻位置的约束。

    LL 的可行范围为 [Lmin,Lmax][L_{\min}, L_{\max}],初始为 (0,+)(0, +\infty)

    对于每个相邻位置:

    • 情况1:无条件(如果 hi<hi+1h_i < h_{i+1}
    • 情况2:Lmin=max(Lmin,hi+hi+12)L_{\min} = \max(L_{\min}, \frac{h_i + h_{i+1}}{2})
    • 情况3:Lmax=min(Lmax,hi+hi+12)L_{\max} = \min(L_{\max}, \frac{h_i + h_{i+1}}{2})
    • 情况4:无条件(如果 hi>hi+1h_i > h_{i+1}

    如果最终 Lmin<LmaxL_{\min} < L_{\max},则区间可行。


    算法设计

    双指针法

    核心思想:对于每个起点 uu,找到最大的 vv 使得 [u,v][u, v] 可行,那么所有 [u,u+1],[u,u+2],,[u,v][u, u+1], [u, u+2], \dots, [u, v] 都可行。

    算法步骤

    1. 初始化指针 r=1r = 1
    2. 对于每个 l=1nl = 1 \dots n
      • 如果 r<lr < l,则 r=lr = l
      • 不断尝试扩展 rr,直到 [l,r+1][l, r+1] 不可行
      • 答案加上 rlr - l(即区间 [l,l+1],,[l,r][l, l+1], \dots, [l, r] 都可行)
    3. 输出总答案

    时间复杂度O(n)O(n),因为每个位置最多被左右指针各访问一次。


    实现细节

    1. 约束维护

    我们需要维护当前区间 [l,r][l, r]LL 范围 [Lmin,Lmax][L_{\min}, L_{\max}]

    当从 [l,r][l, r] 扩展到 [l,r+1][l, r+1] 时,只需检查新增的相邻对 (r,r+1)(r, r+1) 的约束。

    当左指针 ll 右移时,需要删除 (l,l+1)(l, l+1) 的约束影响。但直接删除比较困难,可以采用另一种方法:

    2. 可行的实现方法

    对于每个起点 ll,重新计算从 ll 开始的约束,利用之前的信息:

    • 如果 [l,r][l, r] 可行,那么 [l+1,r][l+1, r] 很可能也可行
    • 实际上,我们可以从 rr 开始继续扩展,而不是从 l+1l+1 重新开始

    具体实现时,维护当前 LminL_{\min}LmaxL_{\max},当加入新位置时更新约束,如果 LminLmaxL_{\min} \ge L_{\max} 则停止扩展。

    复杂度分析

    • 时间复杂度O(n)O(n),每个位置最多被右指针访问一次
    • 空间复杂度O(n)O(n),存储高度数组

    总结

    本题的关键在于:

    1. 将问题转化为关于 LL 的不等式组
    2. 发现区间可行性的单调性质
    3. 使用双指针高效统计所有合法区间

    通过维护 LL 的可行范围,我们可以在 O(n)O(n) 时间内解决该问题。

    • 1

    信息

    ID
    3502
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    10
    已通过
    1
    上传者