1 solutions

  • 0
    @ 2025-10-29 14:15:09

    T3. 禁止套娃

    题意

    求一个序列的所有本质不同子序列的本质不同子序列个数之和 mod1000000007\bmod 1000000007n5000n\le 5000

    算法一

    计算一个序列的本质不同子序列个数的方法如下:

    由于会计重,考虑对于每一种子序列,钦定只对它最靠左(贪心)的匹配计数。容易证明存在唯一的这样的子序列到下标的映射。

    dpidp_i 表示末尾选 ii 的本质不同子序列数,则 dp0=1,dpi=j=preii1dpjdp_0=1,dp_i=\sum_{j=pre_i}^{i-1}dp_jpreipre_i 表示上一个与 aia_i 相等的位置,如果不存在则为 00

    或者,令 dpidp_i 表示末尾选 i\le i 的本质不同子序列数,则 dp0=1,dpi=2dpi1dpprei1dp_0=1,dp_i=2dp_{i-1}-dp_{pre_i-1}

    外层暴枚可做到 O(n2n)\mathrm{O}(n2^n),期望得分 3030

    算法二

    直接讲正解。

    设选择的外层子序列下标为集合 II,内层为集合 JIJ\subseteq I。为了方便表述,设占位下标 0I,J0\in I,J。同样只计贪心匹配的情况,限制如下:

    1. II 中相邻两个数 i,ii,i'ai+1i1a_{i+1\sim i'-1} 中不存在 =ai=a_{i'} 的值。
    2. JJ 中相邻两个数 j,jj,j'aI(j,j)a_{I\cap(j,j')} 中不存在 =aj=a_{j'} 的值。

    考虑对 JJ dp。fif_i 表示目前考虑到 ii 且内外层末尾均选 ii 的答案。如果要从 fjf_j 转移过来,那么就要决定 aj+1i1a_{j+1\sim i-1} 这部分如何选外层,设选择了集合 KK,限制如下;

    1. KK 中相邻两个数 k,kk,k'ak+1k1a_{k+1\sim k'-1} 中不存在 =ak=a_{k'} 的值。
    2. KK 中最大值 krk_rakr+1i1a_{k_r+1\sim i-1} 中不存在 =ai=a_i 的值。
    3. KK 中任意 kkakaia_k\ne a_i

    一个简洁的处理方法是,对于每一个 ii,dp 出 >> 每个 jj 的只需满足 1、3 条件的本质不同子序列个数 gi,jg_{i,j},真正转移时 fi+(gi,jgprei,j)fjf_i\xleftarrow{+}(g_{i,j}-g_{pre_i,j})\cdot f_j 即可。最后汇总答案可以弄一个必选的占位下标 n+1n+1

    gg 是 2D/0D,ff 是 1D/1D,时间复杂度 O(n2)\mathrm{O}(n^2),期望得分 100100

    • 1

    Information

    ID
    1615
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    (None)
    Tags
    (None)
    # Submissions
    0
    Accepted
    0
    Uploaded By