1 条题解

  • 0
    @ 2025-3-8 19:13:08

    猜猜为什么叫「追忆」。

    对于一个子序列 aa,考虑计算最大的 kk 满足它是 kk-好的而不是 k+1k+1-好的,随后统计后缀和即可。考虑 kk 如何计算,这是一个经典贪心,我们从 k=0k = 0 开始从左往右扫该序列,每次遇到一段满足 [1,c][1, c] 所有元素均出现就 kk+1k \gets k + 1 并开始新的一段。

    我们可以写出两种不同的 dp:

    1. fi,l,Sf_{i,l,S} 表示:考虑 a1,,aia_1, \ldots, a_i 的所有子序列,当前 kk 的值为 ll,最后未满的一段所有出现的元素构成集合 SS 的方案数。转移直接枚举 ai+1a_{i+1} 是否被选择即可,然后将 fi,l,[c]f_{i,l,[c]} 转移到 fi+1,l+1,f_{i+1,l+1,\varnothing}。时间复杂度 O(n22cc)\mathcal O(n^2 \cdot \frac{2^c}{c})
    2. 忽略最后未满的一段。fi,lf_{i,l} 表示当前选出了 ll 段,且最后一段的结尾为 aia_i 的方案数。fj,l1f_{j,l-1} 转移到 fi,lf_{i,l} 时,设 (j,i)(j, i) 内元素 bb 出现了 cbc_b 次,则转移系数为 bai(2cb1)\prod\limits_{b \neq a_i} (2^{c_b} - 1)。最后统计答案时,还要求出 gig_i 表示 ai+1,,ana_{i+1}, \ldots, a_n 内有多少个子序列不满足 [1,c][1, c] 均出现至少一次,然后将 fi,*f_{i,\text *} 全部乘上 gig_i。时间复杂度 O(n3c)\mathcal O(\frac{n^3}{c})

    结合两种做法,时间复杂度 O(n3logn)\mathcal O(\frac{n^3}{\log n}),常数较小。std 的阈值取 99

    信息

    ID
    1149
    时间
    4000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    11
    已通过
    2
    上传者