1 条题解

  • 0
    @ 2026-9-9 8:54:22

    题解

    思路

    在序列首尾加入值只出现一次的哨兵 A0=0,AN+1=N+1A_0=0,A_{N+1}=N+1,并要求选择两个哨兵。

    做法

    设相邻选中的位置为 i<ji<j,唯一性等价于开区间 (i,j)(i,j) 内既没有 AiA_i,也没有 AjA_j;否则可以把相应端点换到区间内部得到另一种取法,反之从左右两端贪心匹配会得到同一组下标。记 nextinext_i 为 AiA_i 下一次出现的位置,prevjprev_j 为 AjA_j 上一次出现的位置,则合法转移恰为 j≤nextij\le next_i 且 prevj≤iprev_j\le i。

    令 dpjdp_j 为以 jj 作为当前最后位置的合法路径数,则 dpjdp_j 是所有 i∈[prevj,j−1]i\in[prev_j,j-1] 且 nexti≥jnext_i\ge j 的 dpidp_i 之和。按 jj 从左到右扫描,在树状数组的下标 ii 处维护尚未过期的 dpidp_i,到 nexti+1next_i+1 时删除,再查询区间 [prevj,j−1][prev_j,j-1] 即可。dpN+1dp_{N+1} 包含空子序列,最后减一。

    复杂度

    时间复杂度 O(Nlog⁡N)O(N\log N),空间复杂度 O(N)O(N)。

    • 1

    信息

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