题目链接
做法
参考自这篇文章。
最长连续序列不能相交,那么只有包含关系。
那么我们可以根据区间的包含关系建出一棵以 $ n $ 为根的树,用 $ dis[i] $ 表示节点 $ i $ 的儿子个数。
因为连续的区间可以看成一个点,所以每个节点的贡献可以分别考虑。
设 $ f[i] $ 为长度为 $ i $ 且有多少个长度为 $ i + 1 $ 的连续序列,删去最大数后不存在长度超过 $ 1 $ 的连续序列,答案为 $ \prod { f[dis[i]] } $ 。
若 $ f[i] $ 如果从合法方案转来,只要最后一个数不等于 $ i $ 即可,方案数为 $ (i − 1) \times f[i − 1] $ 。
否则,那么不满足的区间只有有一个,长度设为 $ l $ ,把最大值插入形成合法区间的方案数为 $ f[l] $ ,把插入后的区间看成一个点,与剩下的点的方案数为 $ f[i − l] $ ;若要保证有解,那么这个区间的范围一定在 $ [2,i − l] $ ,所以得到:
$$ f[i] = (i - 1) \times f[i - 1] + \sum_{l = 2}^{i - 2}{(i - l - 1) \times f[i]f[i - l]} $$
分治 $ FFT $ 即可。
1 |
|