析合树
upd:洛谷为啥把这个读 xi ge shu 啊,不信你看url
写给来备忘的,所以非常随意,懒得他妈写latex了。
连续段就是值域连续的段,析合树用来维护
本原段是一个极长的,但可能被一些线段包含,但不存在一个与之相交的连续段的段。
每个点代表着一个本原段。本原段之间构成树。
叶子是原序列中间的树。
树上的非叶子节点有两种 合点 析点,合点是儿子 之间有相对顺序 的节点,析点是不是合点不是叶子点。 可以证明析点任意取一段不是整个区间的儿子都不连续,否则就会合并成一段儿子(这显然是一个本原段)。
建树可以维护前缀森林,然后经典地,连续段就是对于右端点维护区间 max - min - len + 1 的值,这个显然>=0直接二分找0。
很几把难写。
一个区间是连续段仅当是树上的本原段或者从叶子往上到一个合点的一段连续的儿子。
作用
找包含某个区间的最小连续段。 直接倍增就行。
区间数连续段数。也是找到lca,还是得维护一下作为左端点或者作为右端点往上跳的答案,然后倍增,析点如果直接数儿子的和,和点要数儿子的和加上长度不为 1 的段数,这和儿子的排名相关,记录一下就行,细节号急爸多啊对于每个点还得维护一个儿子 的和 的前缀和。
本质就是求 形态不同的析合树个数。 因为刚刚说的东西证明 析合树唯一决定了 一个 区间是否是连续段。
这个 直接 让 gi 表示 i 个叶子的析合树个数, f i j 表示 i 个根 j 个叶子的析合森林个数。
一个析合树 显然是一个析合森林 加一个根形成的 ,加析根需要 i>=4 加合 根需要 i>=2 。 (一个点显然不可能。) 而 三个点及以下 的 儿子序列 无法避免出现长度大于 1 的连续段,代表可以合并出来一段合儿子。非法。
所以我们只关心 根的大小和 4 的 min 的值。
然后这个 dp 就是 n^2 的了只需要记4个或者更多的析合树森林的数量,显然这是个(有序)自卷积,可以分治fft到nlog^2n。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17970943,谢谢你的阅读或转载!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步