1 条题解

  • 1
    @ 2025-11-17 16:43:33

    给定一个长度为 nn 的正整数数组,请您求出有多少个非空子数组满足:该非空子数组的正整数之和能被出现在该非空子数组中的最大数字。

    1n1051\le n\le 10^5

    标签:前缀和。

    枚举数字 dd1199(显然数字 00 不可能成为最大数字)。将问题转化为计算满足正整数之和能被 dd 整除并且最大数字是 dd 的非空子数组的数量。

    下面先考虑如何计算满足正整数之和能被 dd 整除的子数组数量。求出在模 dd 意义下的前缀和数组 sumsum,非空子数组 [al,,ar][a_{l},\cdots,a_r] 能被 dd 整除的充要条件是 suml1=sumrsum_{l-1}=sum_{r}。扫描整个数组并用一个计数数组即可计算数量。

    下面考虑加上限制“最大数字是 dd”。ii11nn 扫描整个数组 xix_i,并维护在模 dd 意义下的前缀和 sumsum、大小为 dd 的计数数组 cntcnt 和用于暂时储存数值的容器 vectorvector,最初把 sum=0sum=0 存入 vectorvector

    如果 xix_i 的最大数字小于 dd,那么首先把 cntsumcnt_{sum} 加入答案,然后把 sumsum 存入 vectorvector

    如果 xix_i 的最大数字等于 dd,那么首先拿出 vectorvector 里的所有数值并把它们加入 cntcnt,然后把 cntsumcnt_{sum} 加入答案,之后把 sumsum 存入 vectorvector

    如果 xix_i 的最大数字小于 dd,那么首先清空 cntcntvectorvector,然后把 sumsum 存入 vectorvector

    时空复杂度:O(n)O(n),含有常数 99

    信息

    ID
    601
    时间
    1000ms
    内存
    512MiB
    难度
    9
    标签
    递交数
    17
    已通过
    3
    上传者