2 条题解

  • 3
    @ 2026-10-22 20:11:24

    T3 < T1T2T4
    此做法简单于bz做法(我声称最简单的)。
    区别在于Part2.

    第一空

    对于一个栅栏 ii,他能粉刷到的最高的方案是粉刷包含 ii 且长度为 xx 的连续区间中栅栏高度的最小值的最大值。

    因为粉刷一个区间的最大高度是区间中栅栏高度的最小值,我们要让这个值最大,以让栅栏 ii的粉刷高度最大。

    可以使用滑动窗口解决,复杂度 O(n)O(n)。

    第二空

    对于一个已经刷了,且高度为 coloricolor_i的栅栏,我们可以把连续相同 colorcolor 的栅栏看成一组,若一组有 cntcnt 个栅栏,我么对他的粉刷次数就是 ⌈cntx⌉\left\lceil \frac{\mathrm{cnt}}{x} \right\rceil,因为可以重复刷,所以向上取整是对的。

    单独对于第二空贴出代码: clr是color ans2是第二空的答案

        int cnt=1;
        for(int i=2;i<=n+1;i++){
            if(clr[i]!=0&&clr[i]==clr[i-1]) cnt++;
            else ans2+=cnt/x+(cnt%x==0?0:1),cnt=1;
        }
    
    • @ 2026-10-23 8:40:10

      提个建议:$\lceil{\frac{a}{b}}\rceil = \lfloor\frac{a+b-1}{b}\rfloor$

  • 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代替滑动窗口。

    • 1

    信息

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