1 条题解

  • 0
    @ 2026-9-3 11:07:02

    题解

    思路

    设 nxtinxt_i 是 ii 右侧第一个比 pip_i 小的位置。按首个保留位置分类可达数组。令 fif_i 表示首个保留元素为 pip_i 的方案数,令 chainichain_i 沿连续的“右侧首个更小位置”累加对应方案。

    做法

    从右向左处理,有

    $$f_i=\sum_{j=i+1}^{nxt_i}f_j+chain_{nxt_i},\qquad chain_i=f_{nxt_i}+chain_{nxt_i}.$$

    把空后缀看作位置 nn 的一个方案;若不存在 nxtinxt_i,区间和一直取到该空方案。单调栈在线性时间内求出全部 nxtinxt_i,后缀和维护区间和。

    最终数组的首个保留元素必须是原数组的某个前缀最小值,因此把这些位置的 fif_i 相加。

    递增子任务中第一个元素永远保留,其余元素可独立选择保留或删除,答案为 2n−12^{n-1}。小规模可对当前保留位置集合做 BFS,枚举每次坍缩的连续段。

    独立复核实现使用值域线段树寻找右侧首个更小位置,并用 Fenwick 树维护上述区间和。

    复杂度

    主算法每组时间复杂度 O(n)O(n),空间复杂度 O(n)O(n)。

    • 1

    信息

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