1 条题解
-
0
自动搬运
来自洛谷,原作者为

vegetable_king
全身全霊!MORE MORE JUMP!!搬运于
2025-08-24 22:54:42,当前版本为作者最后更新于2024-02-15 14:46:16,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
非常好 Counting,使我滨州发光旋转。
显然无解,判掉。
首先考虑,对于一个 的数,如果它填到了左边,那么它所对应的位置就没有限制了。所以考虑在 的数中选择 个,有序地填到左边,右边 个位置就有 个没有限制,剩下 个位置有限制。
如果我们设 为一个长为 的序列,前面 个位置没有限制,后面 个位置有限制的方案数,则答案为 ,现在我们的目标就变为快速求出 。
考虑推导出递推式。按照传统错排问题的思路,考虑填一个有限制的位置对应的数。考虑两种情况:
- 其对应的数填到了一个无限制的位置,则这个有限制的位置变为无限制的位置,被填到的那个位置被移除,相当于少了一个有限制的位置,无限制的位置个数不变,方案数为 。
- 其对应的数填到了另外一个有限制的位置,则这个有限制的位置变为无限制的位置,被填到的那个位置被移除,相当于少了两个有限制的位置,无限制的个数多了一个,方案数为 。
于是可以 预处理 。
尝试填一个无限制的位置对应的数得到另一个递推式,考虑两种情况:
- 其对应的数就填在这个位置,则不产生任何贡献,方案数为 。
- 钦定其对应的数不能填在这个位置,这个无限制的位置变为有限制的位置,方案数为 。
整合一下得到两个递推式:
$$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}\\ $$将第二个递推式代入第一个递推式的 中,得到:
$$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}\\ $$所以如果知道了 可以 求出 。根据最开始的第二个递推式,有:
$$f_{i + 1, j} = f_{i, j} + f_{i, j + 1}\\ f_{i + 1, j + 1} = f_{i, j + 1} + f_{i, j + 2}\\ $$将 代入,得:
$$f_{i + 1, j + 1} = (j + 1) \times f_{i, j} + (i + j + 2) f_{i, 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\\ $$综上所述,我们可以维护 ,并在 的时间复杂度内支持 四种操作。于是将询问离线下来,上莫队即可,时间复杂度为 。代码在这里。
- 1
信息
- ID
- 9754
- 时间
- 3000ms
- 内存
- 1024MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者