朴素析合树计数相关——2025.6.30 鲜花

朴素析合树计数相关

床边故事
从前从前有只猫头鹰
它站在屋顶
屋顶后面一片森林
森林很安静
安静的钢琴在大厅
阁楼里 仔细听
仔细听 叮叮叮
什么声音
乖乖睡 不要怕 听我说
乖乖睡 醒来就 吃苹果
不睡觉 的时候 有传说
会有人 咬你的 小指头
这故事 继续翻页 再翻页
你继续 不想睡 我却想睡
然后我准备去打开衣柜
去看看 躲着谁
去看看 躲着谁
纸上的城堡卡片
发光的立体呈现
奇幻的床边故事
动听的令人称羡
场景瞬间变化
我接着又施展魔法
活过来说话
准备开始吧
等天黑一起倒数后关上灯
三二一 入梦境的缤纷
我们并非正常人
游戏怎么会照剧本 oh
天黑一起来关上灯
三二一 进自由的灵魂
Ohohohoh oh come on
再回童年 敲敲门
滴哒滴哒突然开始摆动
墙上老挂钟
古董油画出现诡异的笑容
好的巫婆坏掉的苹果
愿望要跟谁说
旋转的音乐盒
我竖起耳朵听
这不会是一场梦
Oh 梦 一下子瞬间跳跃
我翻阅下个世界
满满都是蝴蝶
森林满满蝴蝶
窗外纷飞着雪
一觉醒来旁边躺着是谁
这故事 继续翻页 再翻页
你继续 不想睡 我却想睡
然后我准备去打开衣柜
去看看 躲着谁
去看看 躲着谁
纸上的城堡卡片
发光的立体呈现
奇幻的床边故事
动听的令人称羡
场景瞬间变化
我接着又施展魔法
活过来说话
准备开始吧
等天黑一起倒数后关上灯
三二一 入梦境的缤纷
我们并非正常人
游戏怎么会照剧本 oh
天黑一起来关上灯
三二一 进自由的灵魂
Ohohohoh oh come on
再回童年 敲敲门
乖乖睡啊 不要害怕
乖乖睡醒来就吃苹果啊
不睡觉啊 有传说啊
会有人咬你的小指头啊
等天黑一起倒数后关上灯
三二一 入梦境的缤纷
我们并非正常人
游戏怎么会照剧本 oh
天黑一起来关上灯
三二一 进自由的灵魂
Ohohohoh oh come on
再回童年 敲敲门
再回童年 敲敲门
再回童年 敲敲门

这里只讲析合树的计数相关部分,即计数析合树个数,甚至不讲如何建析合树。没准以后会写

朴素析合树是对于特化析合树叫的,就是一般的析合树。

设排列是 \(P\)

定义连续段是 \([l, r] \text{ s.t.} \max_{i\in [l, r]} P_i - \min_{i\in [l, r]} P_i = r - l\)

容易发现连续段不可能严格相交(即不算包含),且一个点一定是连续段。

我们建出这个树形结构,叫做析合树。

定义合点是一个点满足其任意一个非平凡连续儿子(即长度不为 \(1\) 且不是全部)都是连续段

定义析点是不是合点的点。

叶子节点和只有两个儿子的点其实定义成析点还是合点都无所谓,这里我们采用广泛的定义定义其是合点。

定义一个点的儿子排列是取出其所有儿子所表示的区间的左端点并离散化形成的排列,也叫其儿子序列,容易发现合点的排列是升序或降序的。

析点满足其任意一个非平凡连续儿子(即长度不为 \(1\) 且不是全部)都不是连续段

这个性质挺让人迷惑的,但是证明其实不难,考虑到其若有非平凡连续儿子形成连续段则可以将这些儿子缩成一个合点。

考虑一些计数相关的事情。

考虑求一个长为 \(l\) 合点的方案数,其实非常的简单,考虑枚举其第一个儿子的长度 \(k\),于是我们要找一个长为 \(k\) 的排列且其任意前缀都不是连续段,设其数量是 \(g_k\),显然有单步容斥递推式:

\[g_i = i! - \sum_{j < i} g_j(i - j)! \]

可以 \(n\log n\) 甚至 \(\frac {n\log^2 n}{\log\log n}\) 甚至 \(n \log^2 n\) 甚至 \(n ^ 2\) 求出。

所以最后答案是 \(2\sum_{i = 1}^{n - 1}g_i(n - i)!\),注意可以正或反要乘 \(2\)

考虑求一个长为 \(l\) 的析点方案数,我们有一个取巧的办法,就是用所有排列数减掉合点方案数。当然这并不能很好的解决有一些限制的问题,于是我们试图找到一个更直接的做法。

\(f_k\) 表示一个长为 \(k\) 的排列不包含任意连续段,这样的排列可以作为其儿子排列。依然考虑容斥递推,其相当于是一个析点且有 \(k\) 个儿子,设 \(G_{i, j}\) 表示将 \(i\) 个数划分成 \(j\) 个排列的方案数,我们简单容斥得:

\[f_i = i! - 2\sum_{j = 1}^{i - 1}g_j(i - j)! - \sum_{j = 3}^{i - 1}f_jG_{i, j} \]

答案是 \(\sum_{i = 3}^n f_iG_{n, i}\)

注意到边界没有任何贡献,所以我们可以乱设一个,这里设是 \(f_1 = f_2 = 0\),方便后面推导,当然此时所有 \(i = 3\) 都可以改成 \(i = 1\)

很遗憾的是,\(f\) 没有特别快速求的办法,最快的做 \(G\) 也是 \(n^2\log n\)

但是我们研究一下 \(f\) 的递推式依然是有意义的:

先补充一下 \(g\) 的生成函数,设 \(P(x) = \sum_{i \ge 1} i!x^i\) 则生成函数是:\(1 - \frac 1{1 + P(x)}\)

\[f_i = i! - 2\sum_{j = 1}^{i - 1}g_j(i - j)! - \sum_{j = 3}^{i - 1}f_jG_{i, j} \]

发现 \(G_{i,j} = [x^i]P(x)^j\),而 \(2\sum_{j = 1}^{i - 1}g_j(i - j)!\) 可以直接使用递推式展开,所以:

\[[x^i] \sum_{j = 3} ^ i f_jP(x)^j = 2g_i - i! \text{ s.t. } i \ge 3 \]

我们发现左边形似一个多项式复合,将多出的项消掉,就有:

\[\mathcal{F}(P(x)) + x = 2(1 - \frac 1{1 + P(x)}) - P(x) \]

\[\mathcal{F}(x) = \frac {x - x^2}{1 + x} - P^{\left\langle -1 \right\rangle}(x) \]

这个东西一般有奇效,就是比如说我们现在就算一个没有限制的,我们直接带入 \(G\) 得:

\[\begin{aligned} \sum_i f_iG_{n, i} &= [x^n]\sum_i f_iP(x) \\ &= [x^n] \mathcal{F}(P(x)) \\ &= [x^n] \frac {P(x) - P(x)^2}{1 + P(x)} - x \\ \end{aligned}\]

即可迅速做,在有限制的也类似。当然你再推一步就变成之前的单步容斥了,虽然这个例子很糖,但还是能感受到那股劲的。

一个正常点的例子是:P7278 纯洁憧憬\(n\log^2 n\) 做法,可以直接看 NaCly_Fish 的题解,但她的做法的 \(f\) 初值是 \(f_1 = 1, f_2 = 2\),虽然最后推到答案函数就没区别了就是了我不会拉反

P





posted @ 2025-06-30 08:01  xrlong  阅读(40)  评论(0)    收藏  举报

Loading