1 条题解

  • 0
    @ 2025-10-28 11:09:48

    题目理解

    给定一个长度为 N N 的序列 A A ,定义子串 L L 的权值为:

    VL=min(L)×max(L)×len(L)VL=min(L)×max(L)×len(L)

    要求计算所有连续子串的权值之和,对 109 10^9 取模。

    数据范围:

    N5×105 N \leq 5 \times 10^5

    直接枚举所有子串 O(N2) O(N^2) 不可行

    算法思路

    这道题采用 分治(CDQ 分治) 的方法,每次取区间中点 mid \mathrm{mid} ,计算跨越中点的所有子串的贡献。

    对于区间 [l,r] [l, r] ,中点 m=(l+r)/2 m = \lfloor (l+r)/2 \rfloor ,跨越 m m 的子串 [i,j] [i, j] 满足 im<j i \le m < j

    四种情况

    设:

    mn[i] \mathrm{mn}[i] [i,m] [i, m] 的最小值

    mx[i] \mathrm{mx}[i] [i,m] [i, m] 的最大值

    mnR[j] \mathrm{mnR}[j] [m+1,j] [m+1, j] 的最小值

    mxR[j] \mathrm{mxR}[j] [m+1,j] [m+1, j] 的最大值

    对于跨中点的子串 [i,j] [i, j] ,其:

    min=min(mn[i],mnR[j])min=min(mn[i],mnR[j])

    max=max(mx[i],mxR[j])max=max(mx[i],mxR[j])

    长度 =ji+1 = j - i + 1

    情况 1:LL

    左半部分同时控制最小值和最大值

    mn[i]mnR[j] \mathrm{mn}[i] \le \mathrm{mnR}[j] mx[i]mxR[j] \mathrm{mx}[i] \ge \mathrm{mxR}[j]

    贡献为 $ \mathrm{mn}[i] \times \mathrm{mx}[i] \times \sum_{j} (j-i+1) $

    情况 2:RR

    右半部分同时控制最小值和最大值

    mnR[j]<mn[i] \mathrm{mnR}[j] < \mathrm{mn}[i] mxR[j]>mx[i] \mathrm{mxR}[j] > \mathrm{mx}[i]

    贡献为 $ \mathrm{mnR}[j] \times \mathrm{mxR}[j] \times \sum_{i} (j-i+1) $

    情况 3:LR

    左半部分控制最小值,右半部分控制最大值

    mn[i]mnR[j] \mathrm{mn}[i] \le \mathrm{mnR}[j] mx[i]<mxR[j] \mathrm{mx}[i] < \mathrm{mxR}[j]

    贡献为 $ \mathrm{mn}[i] \times \mathrm{mxR}[j] \times (j-i+1) $

    情况 4:RL

    左半部分控制最大值,右半部分控制最小值

    mn[i]>mnR[j] \mathrm{mn}[i] > \mathrm{mnR}[j] mx[i]mxR[j] \mathrm{mx}[i] \ge \mathrm{mxR}[j]

    贡献为 $ \mathrm{mx}[i] \times \mathrm{mnR}[j] \times (j-i+1) $

    双指针 + 前缀和优化

    对于每种情况,使用双指针维护满足条件的 j j 的范围,并用前缀和数组快速计算 j \sum j mxR[j]×j \sum \mathrm{mxR}[j] \times j 等,从而在 O(len) O(\mathrm{len}) 内完成跨中点计算。

    代码结构

    solve(l,r) \mathrm{solve}(l, r) :分治主函数

    情况 LL:左端控制 min 和 max

    情况 RR:右端控制 min 和 max

    情况 LR:左 min 右 max,用 sum1 \mathrm{sum1} sum2 \mathrm{sum2} 维护右段信息

    情况 RL:左 max 右 min,同样用前缀和优化

    递归处理左右子区间

    复杂度

    每层分治 O(n) O(n) ,总 O(NlogN) O(N \log N)

    空间 O(N) O(N)

    总结

    这道题是典型的分治统计问题,通过将跨中点子串按最值控制情况分类,并利用双指针和前缀和快速计算贡献,将复杂度从 O(N2) O(N^2) 降为 O(NlogN) O(N \log N) ,是处理区间最值与子串统计问题的经典方法。

    • 1

    信息

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