1 条题解

  • 8
    @ 2026-4-23 18:45:55

    对于一个 f(i)f(i) ,我们只关心所有数与 ii 的位置关系,即大于 ii 的要在 ii 的右边,小于的在左边,而其他数的相对位置我们并不关心。于是一次 [l,r]>1[l,r]->1[l,r]>n[l,r]->n 包含数 ii 的操作可以由 [r+1,n]>1[r+1,n]->1[1,l1]>n[1,l-1]->n 来替代,效果不变。

    posipos_i 表示数 ii 的位置,于是所有操作有 r<posir<pos_il>posil>pos_i ,不难想到最优方案为每次把左边一段连续的大于 ii 的数移到最右边,右边同理。

    于是 f(i)f(i) 便为 ii 左边大于 ii 的数的极大连续段个数与 ii 右边小于 ii 的极大连续段个数之和,这是一个简单的连续段DP。

    dpi,j,k,0/1dp_{i,j,k,0/1} 表示从大到小填了 ii 个数,当前连续段个数为 jjff 值之和为 kk,排列的右端点是否已被填的方案数,转移便很显然了。

    时间复杂度 O(n2m)O(n^2m) ,当 n=100n=100 时,发现 mm30003000 左右的时候答案便是 n!n! 了,将 mm30003000 取min ,可以减少一定的时间与空间消耗。

    • 1

    信息

    ID
    16
    时间
    1000ms
    内存
    512MiB
    难度
    9
    标签
    递交数
    419
    已通过
    35
    上传者