loj2554
题意
对于一个排列\(P\),定义映射\(f:P\rightarrow l\),\(l_i\)为\(P\)中第\(i\)个位置最靠左的位置使得区间\([i-l_i+1,i]\)在\(P\)上对应的整数集合是连续的
给定\(l\),求有多少不同的\(P\)通过\(f\)映射后为\(l\)
做法
对于\(n\)对区间\([l_i,i]\),要么相离要么包含,抽象成一棵树
对于一个点,令其区间长度为\(len\),有\(k\)个儿子,要将\([1,len]\)分配给\(k\)个儿子,满足
- 每个儿子内都是连续的
- 将儿子离散成一个数字时,没有非平凡的连续区间
令\(f_i\)为:没有非平凡连续区间的\(i+1\)排列个数
则\(Ans=\prod\limits_{i=1}^n f_{l_i}\)
边界情况\(f_0=1,f_1=2\),通式:
证明:
将一个合法数组\(A\)映射到\(B\),\(b_{a_i}=i\)
\(A\)没有非平凡连续区间的\(\Longrightarrow\)\(B\)不存在不包含最大元素的非平凡连续区间
已插入\([1,n]\),将元素整体\(+1\),现在考虑往里面插\(1\)
\(1)~~\)原序列已合法
只要\(1\)不在\(2\)旁边就好了。有\(n+1-2=n-1\)个位置
\(2)~~\)原序列不合法
最多有一个极长区间不合法,设其长度为\(len\),则原值域为\([x,x+len-1]\),然后把\(1\)插进去破坏
只考虑这部分,方案数为\(f_{len}\),相当于把\(1\)当做里面的\(len+1\)
再考虑\(x\)的范围,\([2,n-len]\):如果左端点为\(1\)则插进来没法破坏,如果右端点为\(n-len+1\)则极大区间为整个序列。所以要乘个\(n-len-1\)的系数
然后把这个区间缩成一个点,由于只有一个区间不合法,剩下的方案数为\(f_{n-len}\)
\(2\le len\le n-2\),左端点右端点要满足区间非平凡
显然\(\sum_{i=2}^{n-2}(n-i-1)f_if_{n-i}=\sum_{i=2}^{n-2}(i-1)f_if_{n-i}\)
直接分治\(fft\)就好了