1 条题解

  • 0
    @ 2025-10-28 9:01:50

    问题分析

    我们有 nn 个水平的货架(线段),第 ii 个货架在高度 y=iy = i 上,左右端点分别为 (li,i)(l_i, i)(ri,i)(r_i, i)

    关键观察:当打开一个货架的水龙头时,水会从货架两端垂直流下,如果流经下方的其他货架,就会淹没那些货架。

    更精确地说:对于货架 ii,如果存在货架 jj 满足:

    j<ij < i(即货架 jj 在货架 ii 下方)

    lj<li+ri2<rjl_j < \frac{l_i + r_i}{2} < r_j(即货架 ii 的中点垂直投影落在货架 jj 上)

    那么打开货架 ii 的水龙头也会淹没货架 jj

    关键转化

    AiA_i 为指示随机变量,表示在随机排列中货架 ii 的水龙头被打开。

    对于货架 iiAi=1A_i = 1 当且仅当在排列中,所有能淹没货架 ii 的货架都在 ii 之后被考虑。

    换句话说:设 SiS_i 是能淹没货架 ii 的所有货架集合(即所有满足 j>ij > i 且货架 jj 的中点投影落在货架 ii 上的货架 jj),那么货架 ii 被打开当且仅当在随机排列中,ii 出现在 SiS_i 中所有元素之前。

    算法实现

    现在问题转化为:对于每个货架 ii,计算有多少个货架 j>ij > i 满足 li<lj+rj2<ril_i < \frac{l_j + r_j}{2} < r_i

    高效计算方法

    预处理:对于每个货架 ii,计算其中点 mi=li+ri2m_i = \frac{l_i + r_i}{2}

    扫描线:按高度从高到低处理货架(即 iinn11):

    对于当前货架 ii,查询区间 [li,ri][l_i, r_i] 内有多少个中点

    然后将 mim_i 加入数据结构

    数据结构:使用树状数组或线段树来维护中点位置的计数。

    时间复杂度:O(nlogn)O(n \log n)

    • 1

    信息

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