1 条题解

  • 0
    @ 2026-5-3 19:41:00

    (说在前面:这篇题解写的非常长,并且没有 code,但是个人认为可以比较好的写明思考过程,如果你追求效率,请看其他题解)

    点我!我是题目传送门

    题意简述

    海滩有 nn 个连续区段,第 ii 个区段上有 aia_i 枚琥珀。已知每一道海浪的宽度相同(均为 kk),且恰好向连续的 kk 个区段各输送一枚琥珀(海浪可以任意多次使用),求可能的最大海浪宽度 kk

    思路分析

    将问题抽象:给定非负整数序列 a1,,ana_1,\dots,a_n,是否存在非负整数序列 b1,,bnk+1b_1,\dots,b_{n-k+1}bjb_j 表示以 jj 为起点的海浪数量),使得对于每个位置 ii

    ai=j=max(1,ik+1)min(i,nk+1)bja_i = \sum_{j=\max(1,i-k+1)}^{\min(i,n-k+1)} b_j

    等价于用长度为 kk 的全 11 区间(可重叠)去覆盖每个位置,覆盖次数恰好为 aia_i,求最大的可行 kk

    我们注意到

    m=nk+1m=n-k+1,并定义前缀和 Bi=j=1ibjB_i=\sum_{j=1}^i b_j。通过分析覆盖关系可得:

    • 对于 i=1,,mi=1,\dots,m,有 ai=Bia_i = B_i(因为覆盖位置 ii 的区间起点只有 1,,i1,\dots,i)。
    • 对于 i=m+1,,k1i=m+1,\dots,k-1(如果存在),有 ai=Bma_i = B_m
    • 对于 i=k,,ni=k,\dots,n,令 j=ikj=i-k,则 ai=BmBja_i = B_m - B_j

    由此可以导出使得 kk 可行的充要条件

    1. a1a2ama_1 \le a_2 \le \dots \le a_m废话,前缀当然是非递减的)。
    2. m+1nmm+1 \le n-m,则区间 [m+1,  nm][m+1,\;n-m] 内的所有 aia_i 均等于 ama_m
    3. anm+1=ama_{n-m+1} = a_m(即 ak=ama_k = a_m)。
    4. 对于所有 j=1,,m1j=1,\dots,m-1,有 aj+aj+nm+1=ama_j + a_{j+n-m+1} = a_m

    其中 m=nk+1m=n-k+1。当 k=1k=1 时,任何序列都可行(每道浪只覆盖一个区段),故 k=1k=1 总是可行。

    因此,我们可以从大到小枚举 kk(即从小到大枚举 mm),利用预处理快速检查上述条件。由于 n105n\le 10^5,直接枚举所有 kkO(1)O(1) 判断即可。

    实现

    预处理

    • 前缀非递减inc[i]inc[i] 表示 a1aia_1\le\cdots\le a_i 是否成立。
    • 区间常数判断nxt[i]nxt[i] 表示从 ii 开始向右第一个不同于 aia_i 的位置(若不存在则为 n+1n+1)。那么区间 [l,r][l,r] 内所有值相等当且仅当 nxt[l]>rnxt[l] > ral=ara_l = a_r(实际上 nxt[l]>rnxt[l] > r 已保证全等)。
    • 字符串哈希:用于快速比较后段 [nm+2,  n][n-m+2,\;n]Ca[1..m1]C - a[1..m-1](其中 C=amC=a_m)。采用多项式哈希,模数 109+710^9+7,基数 131131。预处理前缀哈希 h[i]h[i]、幂 pow[i]pow[i] 以及幂的前缀和 spow[i]=t=0i1pow[t]spow[i]=\sum_{t=0}^{i-1} pow[t]

    复杂度分析

    • 预处理 O(n)O(n),枚举 kk 最多 nn 次,每次检查 O(1)O(1)
    • 总时间复杂度 O(n)O(n),空间复杂度 O(n)O(n)
    • 1

    信息

    ID
    11501
    时间
    1500ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者