1 条题解

  • 0
    @ 2026-8-22 7:00:53

    仓鼠窝 题解

    数值范围

    全 1 矩阵的答案最大,为

    [ \frac{n(n+1)m(m+1)}4. ]

    n=m=3000n=m=3000 时答案为 2026350225000020263502250000,总答案及中间贡献必须使用 64 位有符号整数。

    思路

    逐行扫描。令 hjh_j 表示以当前行为底、列 jj 连续向上的 1 的数量;当前格为 1 时高度加一,为 0 时清零。

    固定当前底行和右端列 rr。若左端列为 ll,可选的顶行数量恰为

    [ \min(h_l,h_{l+1},\ldots,h_r). ]

    所以所有以当前格为右下角的合法矩形数,等于所有后缀最小高度之和。

    做法

    用单调递增栈维护二元组“高度、宽度”。宽度表示有多少个连续左端点的后缀最小值等于该高度,并维护这些后缀最小值之和 SS。插入新高度 hh 时,把所有高度不小于 hh 的栈段弹出:从 SS 中减去旧的高度乘宽度,并把宽度合并到新段。再压入 (h,w)(h,w),把 hwhw 加入 SS,最后把 SS 加入答案。

    每个栈段精确代表一组后缀最小值;新高度只会把旧最小值不小于它的后缀统一降为它。故更新后 SS 仍等于所有后缀最小高度之和。每个矩形又有唯一的底行和右端列,逐格累加不重不漏。

    复杂度

    每个栈段每行至多进栈、出栈一次,时间复杂度为 O(nm)O(nm),空间复杂度为 O(m)O(m)

    部分分

    • 若坏格至多一个,全 1 矩阵用总矩形公式;唯一坏格位于 1-based 坐标 (r,c)(r,c) 时,减去 r(nr+1)c(mc+1)r(n-r+1)c(m-c+1),得到 20 分。
    • n,m30n,m\le30 时,用二维前缀和枚举四条边,复杂度 O(n2m2)O(n^2m^2),得到 10 分。
    • n,m200n,m\le200 时枚举上下边界,维护各列是否全 1,并按连续 1 段计数,复杂度 O(n2m)O(n^2m);它同时通过上一规模层,累计 40 分。
    • 合并“坏格至多一个”的公式与行对枚举,可累计 60 分。
    • 1

    信息

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