1 条题解

  • 0
    @ 2025-8-24 22:54:42

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar vegetable_king
    全身全霊!MORE MORE JUMP!!

    搬运于2025-08-24 22:54:42,当前版本为作者最后更新于2024-02-15 14:46:16,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    可能更好的阅读体验

    非常好 Counting,使我滨州发光旋转。

    2m>n2m > n 显然无解,判掉。

    首先考虑,对于一个 >m> m 的数,如果它填到了左边,那么它所对应的位置就没有限制了。所以考虑在 >m> m 的数中选择 mm 个,有序地填到左边,右边 nmn - m 个位置就有 mm 个没有限制,剩下 n2mn - 2m 个位置有限制。

    如果我们设 fi,jf_{i, j} 为一个长为 i+ji + j 的序列,前面 ii 个位置没有限制,后面 jj 个位置有限制的方案数,则答案为 m!(nmm)fm,n2mm!\binom{n - m}mf_{m, n - 2m},现在我们的目标就变为快速求出 fi,jf_{i, j}

    考虑推导出递推式。按照传统错排问题的思路,考虑填一个有限制的位置对应的数。考虑两种情况:

    1. 其对应的数填到了一个无限制的位置,则这个有限制的位置变为无限制的位置,被填到的那个位置被移除,相当于少了一个有限制的位置,无限制的位置个数不变,方案数为 i×fi,j1i \times f_{i, j - 1}
    2. 其对应的数填到了另外一个有限制的位置,则这个有限制的位置变为无限制的位置,被填到的那个位置被移除,相当于少了两个有限制的位置,无限制的个数多了一个,方案数为 (j1)fi+1,j2(j - 1) f_{i + 1, j - 2}

    于是可以 O(n2)O(n^2) 预处理 fi,jf_{i, j}

    尝试填一个无限制的位置对应的数得到另一个递推式,考虑两种情况:

    1. 其对应的数就填在这个位置,则不产生任何贡献,方案数为 fi1,jf_{i - 1, j}
    2. 钦定其对应的数不能填在这个位置,这个无限制的位置变为有限制的位置,方案数为 fi1,j+1f_{i - 1, j + 1}

    整合一下得到两个递推式:

    $$f_{i, j} = i \times f_{i, j - 1} + (j - 1) f_{i + 1, j - 2}\\ f_{i, j} = f_{i - 1, j} + f_{i - 1, j + 1}\\ $$

    将第二个递推式代入第一个递推式的 fi+1,j2f_{i + 1, j - 2} 中,得到:

    $$f_{i, j} = i \times f_{i, j - 1} + (j - 1)(f_{i, j - 2} + f_{i, j - 1})\\ f_{i, j} = (j - 1)f_{i, j - 2} + (i + j - 1)f_{i, j - 1}\\ f_{i, j + 2} = (j + 1) \times f_{i, j} + (i + j + 1) f_{i, j + 1}\\ $$

    所以如果知道了 fi,j,fi,j+1f_{i, j}, f_{i, j + 1} 可以 O(1)O(1) 求出 fi,j+2f_{i, j + 2}。根据最开始的第二个递推式,有:

    $$f_{i + 1, j} = f_{i, j} + f_{i, j + 1}\\ f_{i + 1, j + 1} = f_{i, j + 1} + f_{i, j + 2}\\ $$

    fi,j+2f_{i, j + 2} 代入,得:

    $$f_{i + 1, j + 1} = (j + 1) \times f_{i, j} + (i + j + 2) f_{i, j + 1}\\ $$

    所以如果知道了 fi,j,fi,j+1f_{i, j}, f_{i, j + 1} 可以 O(1)O(1) 求出 fi+1,j,fi+1,j+1f_{i + 1, j}, f_{i + 1, j + 1}

    我们也可以手动解方程回推,知道 fi,j,fi,j+1f_{i, j}, f_{i, j + 1} 可以 O(1)O(1) 求出 fi,j1f_{i, j - 1} 以及 fi1,j,fi1,j+1f_{i - 1, j}, f_{i - 1, j + 1}

    $$f_{i - 1, j} = \frac{(i + j + 1)f_{i, j} - f_{i, j + 1}}i\\ f_{i - 1, j + 1} = \frac{f_{i, j + 1} - (j + 1)f_{i, j}}i\\ f_{i, j - 1} = \frac{f_{i, j + 1} - (i + j) f_{i, j}}j\\ $$

    综上所述,我们可以维护 (fi,j,fi,j+1)(f_{i, j}, f_{i, j + 1}),并在 O(1)O(1) 的时间复杂度内支持 ii±1,jj±1i \to i \pm 1, j \to j \pm 1 四种操作。于是将询问离线下来,上莫队即可,时间复杂度为 O(Tn)O(T \sqrt n)代码在这里。

    • 1

    信息

    ID
    9754
    时间
    3000ms
    内存
    1024MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者