[AGC024E] Sequence Growing Hard
tag:组合计数
果然连计数也不会了呢。。
题意转化为每次往序列里插入一个数,且只能放在小于这个数的数前面,或者结尾。
比如 \([3,3,2,3,2]\),插入一个 \(3\),则只有 \(3\) 种方式。
然而还是不太好计数。。
考虑继续转化,把操作序列抽象成一个树,将 \(x\) 插入在 \(y\) 之前,看作将 \(x\) 变为 \(y\) 的儿子。
然后会发现一个树和一个操作序列一一对应。
所以相当于对树计数,满足父亲的权值比儿子小。
但是由于此题计数的是整个过程,所以每个点实际上还带了另一个权『时间戳』,满足父亲的时间戳一定小于儿子的时间戳(根据实际意义)。
由于会有插入在结尾的操作,所以加入一个虚点 \((0,0)\)。
设 \(f(i,j)\) 为子树大小为 \(i\),根结点权值为 \(j\)。
转移时枚举时间戳最小的儿子,其时间戳在子树内一定为 \(2\),而这个儿子子树内部其他结点的时间戳可以用组合数计算。然后再枚举其权值。
\[f(i,j)=\sum_{p=1}^{i-1}f(i-p,j)\cdot\binom{i-2}{p-1}\cdot\sum_{val=j+1}^kf(p,val)
\]
枚举权值部分可以用后缀和优化,总复杂度 \(O(n^3)(n,k\)同阶\()\)