析合树学习笔记

析合树学习笔记

析合树是用来形象化表示连续段问题的一种结构,每个节点表示一个本源连续段。析合树有 n n n 个叶子节点。

通过连续段的性质,我们把除了叶子节点的所有节点分成两类,一种是析点,一种是合点。合点表示它的儿子的重新按照大小标号之后为上升或者下降,析点表示它的儿子被按照大小重新标号之后不存在任何非平凡连续段。通过枚举可以发现一个析点的儿子个数 ≥ 4 \ge4 4,合点的儿子个数 ≥ 2 \ge2 2

对于一个析点的儿子是没有限制的,它可以为析点、合点或者叶子。而对于一个上升/下降合点的儿子,它不能为上升/下降的合点。

对于析点和合点的一种理解。考虑划分当前节点,我们先找到区间中的最小值和最大值,如果最小值在最大值左边,考虑找到最小的包含最小值和左端点的连续段,把它划分开,然后递归右半部分。如果最开始最小值在最大值右边,则从右边同样地做。如果按照这种方法,能够划分至少一次,则这个节点就是一个合点,分出来的若干段就是它的儿子。而如果不能划分,则这个点是析点,从左往右每次找到最大的非平凡连续段即可找到所有儿子。

并非是一个排列对应一棵析合树,而是一种连续段划分相同的排列对应一棵析合树,一棵析合树也对应一种排列,在统计排列方案时要注意统计的是排列的方案而非析合树方案,所以析合树上的节点并不是 x x x,叶子节点个数或者排列大小才是。通常利用析合树统计的问题中析合树结构只是利用其递归结构来进行统计。

N N N 个点的排列对应的不同析合树个数

F ( x ) F(x) F(x) 是答案的生成函数,由于只考虑析合树形态的不同,我们不用考虑合点是上升还是下降。
F ( x ) = ( ∑ i ≥ 2 F ( x ) i ) + ( ∑ i ≥ 4 F ( x ) i ) + x F(x)=(\sum_{i\ge2}F(x)^i)+(\sum_{i\ge 4} F(x)^i)+x F(x)=(i2F(x)i)+(i4F(x)i)+x
牛顿迭代解方程或者分治FFT即可。

CometOJ Round #6 F

求长度为 n n n 的,没有非平凡连续段的排列个数。

F ( x ) F(x) F(x) 表示 n ≥ 3 n\ge 3 n3 答案的生成函数, G ( x ) G(x) G(x) 表示根节点为排列对应的析合树根节点为合点的生成函数, H ( x ) H(x) H(x) 为排列的生成函数。

H ( x ) = ∑ i ≥ 1 i ! x i G ( x ) = ∑ i ≥ 2 ( H ( x ) − G ( x ) ) i H(x)=\sum_{i \ge 1} i!x^i\\ G(x)=\sum_{i\ge 2} (H(x)-G(x))^i\\ H(x)=i1i!xiG(x)=i2(H(x)G(x))i

这是因为根节点是上升/下降的合点所以儿子节点不能是上升/下降的合点,所以每个儿子的应为 H ( x ) − G ( x ) H(x) - G(x) H(x)G(x)

整理得到 G ( x ) = H ( x ) 2 H ( x ) + 1 G(x) = \frac{H(x)^2}{H(x)+1} G(x)=H(x)+1H(x)2

考虑 F ( H ( x ) ) F(H(x)) F(H(x))。为什么要考虑 F ( H ( x ) ) F(H(x)) F(H(x)) 呢?因为 F ( x ) F(x) F(x) 相当于一棵深度为 2 2 2 的析合树,除了根节点之外就是叶子节点,而叶子节点也是其儿子节点,代表了排列,也就是 x x x。现在考虑每一个儿子都可以是一棵任意的析合树,而我们统计的是析合树对应的排列个数,于是根节点为析点的析合树对应的排列的生成函数为 F ( H ( x ) ) F(H(x)) F(H(x))

于是我们可以得到 F ( H ( x ) ) + 2 G ( x ) + x = H ( x ) F(H(x)) + 2G(x) + x = H(x) F(H(x))+2G(x)+x=H(x)

P ( x ) = H ( x ) − 2 G ( x ) − x P(x)=H(x)-2G(x)-x P(x)=H(x)2G(x)x,于是可以得到

F ( H ( x ) ) = P ( x ) F ( x ) = P ( H − 1 ( x ) ) [ x n ] F ( x ) = [ x n ] P ( H − 1 ( x ) ) \begin{aligned} F(H(x))&=P(x)\\ F(x)&=P(H^{-1}(x))\\ [x^n]F(x)&=[x^n]P(H^{-1}(x)) \end{aligned} F(H(x))F(x)[xn]F(x)=P(x)=P(H1(x))=[xn]P(H1(x))

考虑扩展拉格朗日反演 [ x n ] P ( H − 1 ( x ) ) = 1 n [ x − 1 ] ( P ′ ( x ) 1 H ( x ) n ) [x^n]P(H^{-1}(x)) = \frac1n [x^{-1}](P'(x)\frac1{H(x)^n}) [xn]P(H1(x))=n1[x1](P(x)H(x)n1) ,多项式快速幂即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值