3 条题解

  • 6
    @ 2026-10-14 17:20:08

    对楼上那为大佬的补充

    首先前面讲解的都很清楚了,

    当前集合排序后<=原数组前len个排序后
    

    对于一次交换 i<j,ai>aji<j,a_i>a_j,如果交换的位置都在前缀 1∼k1\sim k 内,那么前缀里的数字集合不变;如果一个位置在前缀内,一个在后缀,那么前缀中会进入一个更小的数字。因此可以发现:无论进行多少次操作,任意前缀排序后的结果都不会比原排列对应前缀排序后的结果更大。

    所以一个排列 bb 可以被生成,当且仅当对于所有 ii,满足:

    $$sort(b_1,b_2,\dots,b_i)\le sort(a_1,a_2,\dots,a_i)$$

    其中比较是逐位比较。

    因为 n≤20n\le20,考虑状压 DP。我们不枚举最终排列,而枚举当前前缀选择了原排列中的哪些位置。设 dp[S]dp[S] 表示:集合 SS 中的位置对应的数字,可以组成一个合法前缀。若 ∣S∣=k|S|=k,说明当前已经确定了前 kk 个位置。

    转移时枚举一个没有加入的位置 xx,令:

    T=S∪{x}T=S\cup\{x\}

    如果集合 TT 满足前缀限制,则:

    dp[T]+=dp[S]dp[T]+=dp[S]

    判断一个集合是否合法,只需要将集合中的数字排序,与原数组前 ∣S∣|S| 个数字排序后比较即可。

    最终所有位置都被选择:

    S=(1<<n)−1S=(1<<n)-1

    答案就是:

    dp[S]dp[S]

    信息

    ID
    2803
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    (无)
    递交数
    18
    已通过
    9
    上传者