P4566 [CTSC2018]青蕈领主

这是一道牛逼题。


首先我们可以尝试找一波连续区间的性质。

  • 如果两个连续区间有交,那么这两个连续区间的并也是连续区间,

证明略(这么简单都要我来证吗?)。

首先可以发现 \(L_n\) 必然等于 \(1\) ,然后又由于上面的这个性质,我们可以得到若干个不交的连续段,对于每一个连续段其结尾的 \(L_i\) 必然等于开头的位置,这样我们便将整个排列划成了若干个子排列。通过递归处理,我们可以轻易地得到一棵树的结构。

剩下的,我们便需要在这个树的叶子上填入排列,使之满足符合给定 \(L_i\) ,或者说符合这棵树对应的结构。

对于一个节点 \(u\) ,我们实际上可以考虑将这个节点的方案数拆分成两个步骤。

  1. 该节点的每一个孩子节点都是连续段,我们可以考虑将其缩成一个数字,统计这些数字构成的不能存在非包含末尾位置的连续段的排列数。
  2. 考虑再将每个数字拆成连续段,即乘上每一个子树的方案数。

那么我们的问题现在便十分明确了,求出 \(f_i\) 表示长度为 \(i\) 的满足不能存在非包含末尾位置的连续段的排列数。

考虑最后一个位置十分特殊,所以我们考虑从后往前填入数,这里填入数的方式是选择一个符合当前长度的数,将所有比该数大的数都加一。这里我们存在两种情况。

  1. \(f_{i-1}\) 转移而来,那么我们只需要不和最后一个位置的数相邻即可,有 \(i-2\) 种。

  2. 存在一个长度为 \(j\) 的连续段,但是加上第 \(i\) 位后就不存在这个连续段了。首先存在一个想法是先将这个长度为 \(j\) 的连续段缩成一个点,缩完之后的长度为 \(i-j+1\) 的排列同样是需要满足上面的性质的。

    我们再来考虑一波 \(f_i\) 的性质,发现如果我们将每一个元素变成其所在位置,即 \(b_{a_i}=i\)\(f_i\) 就变成了不存在非包含最大值的连续段的排列的个数。我们此时就钦定我们填入的数是正好为长度为 \(j+1\) 的排列中最大的数,那么由于这个最大的数被我们移动到了第一个位置,所以剩下的长度为 \(j\) 的排列便不存在连续段了。

    考虑到对于长度为 \(j\) 的连续段,我们填入的最大值的范围为 \(i-j-1\) ,所以贡献为可以得到为 \(\sum_{j=2}^{i-2}(i-j-1)f_{i-j+1}f_{j+1}\)

然后这个东西显然可以用分治 \(\text{fft}\) 优化,这样的话我们就搞完了。

posted @ 2022-01-06 15:10  Point_King  阅读(67)  评论(0编辑  收藏  举报