1 条题解

  • 0
    @ 2026-8-23 21:56:40

    题解

    思路

    fi,jf_{i,j} 表示以位置 ii 结尾、长度恰好为 jj 的严格递增子序列个数。显然 fi,1=1f_{i,1}=1,且

    fi,j=p<i, ap<aifp,j1.f_{i,j}=\sum_{p<i,\ a_p<a_i} f_{p,j-1}.

    直接枚举前驱需要 O(kn2)O(kn^2)。由于序列元素互不相同且都在 11nn 之间,可以对每个长度 jj 建立一棵树状数组:下标是末尾元素值,存储已经扫描过的位置产生的计数。

    做法

    从左到右扫描每个值 aia_i。长度为 11 的状态贡献为 11。对于 j=2,3,,k+1j=2,3,\ldots,k+1,查询第 j1j-1 棵树状数组在值域 [1,ai1][1,a_i-1] 的前缀和,得到 fi,jf_{i,j},再把它加入第 jj 棵树状数组的坐标 aia_i。最后查询第 k+1k+1 棵树状数组的全局和。

    虽然最终答案保证不超过 8×10188\times10^{18},某些不会继续延伸的较短状态总数可能更大。所有计数均为非负数,因此可以把每次加法饱和到 8×1018+18\times10^{18}+1:若一个被后续转移使用的和超过该值,最终答案也会超过保证;对合法输入的最终答案不会失真。

    子任务 1 中目标长度为 11,每个位置各贡献一个答案。子任务 2 可直接按转移式枚举所有 p<ip<i

    证明

    任意一条以 ii 结尾、长度为 jj 的递增子序列,删去最后的 aia_i 后,会唯一得到一条以某个 p<ip<i 结尾、长度为 j1j-1 且满足 ap<aia_p<a_i 的递增子序列。反之,任意这样的较短子序列都能唯一接上 aia_i。因此转移式没有遗漏也没有重复计数。

    扫描到 ii 时,每棵树状数组只含位置小于 ii 的状态;查询值域 [1,ai1][1,a_i-1] 又恰好筛出末尾值小于 aia_i 的状态。因此树状数组查询与转移式完全一致。由长度和扫描位置的归纳,所有状态计数正确,最后对所有结尾求和即得到所求答案。

    复杂度

    • 时间复杂度:O(knlogn)O(kn\log n)
    • 空间复杂度:O(kn)O(kn)
    • 1

    信息

    ID
    1001
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者