2 条题解

  • 2
    @ 2026-10-22 19:38:20

    Part 1:最大面积

    把每个栅栏看成一个长为 xx 的窗口,选一些窗口覆盖位置,每个位置取覆盖它的窗口高度的 min。最大面积 = 每个位置独立取 max。

    对每个窗口 [l, l+x−1][l,\ l+x-1],定义:

    v[l]=min⁡{hl,hl+1,…,hl+x−1}v[l] = \min\{h_l, h_{l+1}, \dots, h_{l+x-1}\}

    即该窗口能达到的最大高度(受限于窗口内最矮的 hh)。

    位置 ii 能被窗口 ll 覆盖当且仅当 l≤i≤l+x−1l \le i \le l+x-1。所以位置 ii 的最终高度:

    H[i]=max⁡{ v[l]∣i−x+1≤l≤i }H[i] = \max\{\,v[l] \mid i-x+1 \le l \le i \,\}

    两次滑动窗口:

    • 第一次:滑动窗口 min 求出所有 v[l]v[l]
    • 第二次:滑动窗口 max 求出所有 H[i]H[i]

    答案 1 = ∑H[i]\sum H[i]。


    Part 2:最少栅栏数

    已知每个位置 ii 需要被高度至少 H[i]H[i] 的窗口覆盖。按高度值分组处理:

    对于每种高度 valval,有:

    • P[val]P[val]:需要高度 valval 的位置集合
    • L[val]L[val]:能提供高度 valval 的窗口起点集合

    对每组 (val, P, L)(val,\ P,\ L),贪心:双指针,对每个未覆盖的位置 pp,在 LL 中选右端点最远的窗口(即 l+x−1l+x-1 最大),一次操作覆盖尽可能多的连续位置。

    总操作数累加即答案。


    复杂度

    滑动窗口 O(nn),贪心按高度分组总共每个位置和窗口各遍历一次 O(nn)。整体 O(nn)。

    后记

    实际上可以用multiset代替滑动窗口。

    信息

    ID
    2819
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    (无)
    递交数
    19
    已通过
    8
    上传者