IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【XSY4320】Catalan(组合意义,DP,多项式) -> 正文阅读

[数据结构与算法]【XSY4320】Catalan(组合意义,DP,多项式)

题面:

Catalan

题解:

假瑞的做法orz

考虑用组合意义来做,观察递推式 f i = 1 i ∑ j = 0 i ? 1 f j f i ? j ? 1 f_i=\frac{1}{i}\sum_{j=0}^{i-1}f_jf_{i-j-1} fi?=i1?j=0i?1?fj?fi?j?1?,它除了和卡特兰数递推式很像之外,还和二叉树计数的递推式很像。

同时注意到 f 0 = 0 f_0=0 f0?=0,所以递推式可以变为 f i = 1 i ∑ j = 1 i ? 2 f j f i ? j ? 1 f_i=\frac{1}{i}\sum_{j=1}^{i-2}f_jf_{i-j-1} fi?=i1?j=1i?2?fj?fi?j?1?,即我们二叉树中每个非叶子节点都有恰好两个儿子,那么也可知 n n n 一定为奇数。下面 “完全二叉树” 的意义为每个非叶子节点都有恰好两个儿子的二叉树。

那么 f n f_n fn? 就可以理解为枚举每一种完全二叉树,然后把 ∏ u 1 s z u \prod_{u}\frac{1}{sz_u} u?szu?1? 的贡献统计进答案。

注意这里枚举的二叉树是无标号但是有左右儿子之分的,那么我们不妨将这棵二叉树上的点按 dfn 序标号。

发现 ∏ u 1 s z u \prod_u\frac{1}{sz_u} u?szu?1? 就是这棵二叉树的拓扑序数量除以 n ! n! n!,那么现在的问题转变为:枚举每一种二叉树,然后把其拓扑序个数统计进答案。

考虑每个点 i i i(注意这里是按 dfn 序标号,上面已经说过了)在拓扑序中的位置 p o s i pos_i posi?,发现对于每一种 1 ~ n 1\sim n 1n 的排列,如果把它当做 p o s pos pos 序列的话,其唯一对应着一棵普通二叉树,即为这个排列的笛卡尔树。

但是还没完,这个 p o s pos pos 序列对应的不一定是一棵完全二叉树,我们只要那些完全二叉树的方案。

发现一棵树是完全二叉树当且仅当 dfn 序为奇数的点都是叶子,那么一个序列 p o s pos pos 是来自完全二叉树的当且仅当:
? i ? m o d ? 2 = 1 , p o s i > p o s i ? 1 ∧ p o s i > p o s i + 1 \forall i\bmod 2=1, pos_i>pos_{i-1}\land pos_i>pos_{i+1} ?imod2=1,posi?>posi?1?posi?>posi+1?
完整写下来: p o s 1 > p o s 2 < p o s 3 > p o s 4 < ? > p o s n ? 1 < p o s n pos_1>pos_2<pos_3>pos_4<\cdots >pos_{n-1}<pos_n pos1?>pos2?<pos3?>pos4?<?>posn?1?<posn?。我们只需要求出满足该条件的排列个数即可。

考虑让所有大于号都满足,然后容斥哪些小于号不满足,那么就得到了若干段连续的大于号,即:
n ! ∑ s 1 + ? + s m = n ( ∏ i = 1 m ? 1 ( ? 1 ) s i / 2 ? 1 s i ! ) ( ( ? 1 ) ( s m ? 1 ) / 2 s m ! ) n!\sum_{s_1+\cdots+s_m=n}\left(\prod_{i=1}^{m-1}\frac{(-1)^{s_i/2-1}}{s_i!}\right)\left(\frac{(-1)^{(s_m-1)/2}}{s_m!}\right) n!s1?+?+sm?=n?(i=1m?1?si?!(?1)si?/2?1?)(sm?!(?1)(sm??1)/2?)
其中要求 s 1 , ? ? , s m ? 1 s_1,\cdots,s_{m-1} s1?,?,sm?1? 为正偶数, s m s_m sm? 为正奇数。

F ( x ) = ∑ i ≥ 1 , 2 ∣ i ( ? 1 ) i / 2 ? 1 i ! x i F(x)=\sum_{i\geq 1,2|i}\frac{(-1)^{i/2-1}}{i!}x^i F(x)=i1,2i?i!(?1)i/2?1?xi G ( x ) = ∑ i ≥ 1 , 2 ∣? i ( ? 1 ) ( i ? 1 ) / 2 i ! x i G(x)=\sum_{i\geq 1,2\not|i}\frac{(-1)^{(i-1)/2}}{i!}x^i G(x)=i1,2?i?i!(?1)(i?1)/2?xi,那么我们要求的就是:
[ x n ] G ( x ) 1 ? F ( x ) [x^n]\frac{G(x)}{1-F(x)} [xn]1?F(x)G(x)?
时间复杂度 O ( n log ? n ) O(n\log n) O(nlogn)

神奇的是,你发现 ∑ i ≥ 0 ( ? 1 ) i / 2 i ! x i = cos ? ( x ) \sum_{i\geq 0}\frac{(-1)^{i/2}}{i!}x^i=\cos(x) i0?i!(?1)i/2?xi=cos(x) G ( x ) = sin ? ( x ) G(x)=\sin (x) G(x)=sin(x),于是我们要求的其实是:
[ x n ] cos ? ( x ) sin ? ( x ) = [ x n ] tan ? ( x ) [x^n]\frac{\cos(x)}{\sin(x)}=[x^n]\tan(x) [xn]sin(x)cos(x)?=[xn]tan(x)

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:47:47  更:2022-03-12 17:50:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:29:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码