卡特兰数

                          Catalan 数

基础概念

     一个长度为 \(2n\) 的序列 , 其中有 \(n\)\(1\)\(n\)\(-1\) , 求有多少中排列方法使得任意前缀和大于等于 \(0\) ?

     答案为卡特兰数 \(Cat_{n} = \frac{{2n \choose n}}{n + 1}\)

     推导过程 :

     考虑容斥 , 首先没有限制的方案数显然是 \({2n \choose n}\)。 对于不合法的情况 ,将第一次到达 \(-1\) 及其后面部分沿直线 \(y = -1\) 翻折。 那么就相当于将终点对应到了 \((2N , -2)\) , 进一步地 , 发现不合法方

     案数和从原点到 \((2N , -2)\) 的方案数构成双射。 方案数为 \({2n \choose n + 1}\)。所以总方案数 \({2n \choose n} - {2n \choose n + 1}\) , 进一步化简得到答案是 \(\frac{{2n \choose n}}{n + 1}\)

     如图 (有一个 "线" 字打错了)

卡特兰数 学习笔记_时间复杂度

     注意也可以通过范德蒙德卷积公式把 \({2n \choose n}\) 展开。 为 \(\sum{{n \choose i}^2}\)

     另外还存在两个递推式 :

     \(Cat_{n + 1} = \frac{4n - 2}{n + 2}Cat_{n}\)

     \(Cat_{n} = \sum{Cat_{i}Cat_{n - i - 1}}\)

     卡特兰数前 \(6\) 项 : \(1 , 1 , 2 , 5 , 14 , 42 , 132\)

     应用 :

      \(n\) 对括号的合法配对方案数量

      \(n\) 个节点的二叉树的形态数

      \(n + 1\) 个叶子 (\(n\) 个非叶节点) 的满二叉树的形态数 , 走到左儿子 \(+1\) , 走到右儿子 \(-1\) , 类似于括号匹配

      \(n\) 个数入栈后出栈的排列总数

例题

\(AGC021E\)

卡特兰数 学习笔记_子节点_02

题解 :

      首先对于一条蛇而言 , 符合要求当且仅当满足两个条件之一 :

      \(1.\) 得到的最后一个求是蓝色的且它在整个过程中得到的红蓝球个数相等。 \(2.\) 得到的红球比蓝球多。

      设红球个数为 \(R\) , 蓝球为 \(B = K - R\)

      对于 \(R < B\) 的情况 , 显然答案为 \(0\)\(R = B\) 的情况相对棘手 , 但注意到最后一个球必然是蓝色的 , 所以转化为 \((R , B - 1)\) 的情况。

      对于 \(R \geq B + N\) 的情况 , 显然答案是 \({R + B \choose R}\)

      因此只需考虑 \(B < R < B + N\) 的情况。

      首先 , 对于这种情况 , 必然存在 \((N - (R - B))\) 条蛇 , 使得它们得到的红球和蓝球个数一样多 , 且最后一个球是蓝球。 而对于一条这样的蛇 , 如果其长度大于 \(2\) , 那么将其保留最后一个蓝球与前面一个红

      球必然优 , 所以对于这样的蛇得到球的顺序就是 \(RB\) , 问题转化为求是否能找到 \((N - (R - B))\)\(RB\) , 进一步转化就是每个前缀满足蓝球至多比红球多 \((R - N)\) 个。

      不妨定义红球为向右走 , 蓝球为向上走 , 那么就是要求的就是走到 \((R , B)\) 且经过点都在直线 \(y = x + R - N\) 下面的方案数。

      考虑容斥 , 总数显然是 \({R + B \choose R}\) , 而对于不合法的情况可以用近似于卡特兰数证明的方法 , 翻转直线 , 因为所有不合法的折线与任意的走到 \((B − R + n − 1 , 2R − N + 1)\) 的折线之间建立了双

      射。方案数为 \({R + B \choose 2R - N - 1}\)。 故方案数是 \({R + B \choose R} - {R + B \choose 2R - N - 1}\)。 时间复杂度 : \(O(NlogN)\) (瓶颈在于求组合数)

\(P3974\)

卡特兰数 学习笔记_折线_03

题解 :

      首先总数是卡特兰数 \(Cat_{N}\)

      对于一棵 \(N\) 个节点的树 , 其删去一个叶子节点会对应一棵 \((N - 1)\) 个点的树 , 而对于一棵 \((N - 1)\) 个点的无根树 , 其加上一个点又对应着 \(N\) 个点的无根树。 这两者是一一对应关系。 故方案数 \(NCat_{N - 1}\)。 化简得到答案为 \(\frac{N(N + 1)}{4N - 2}\)。 时间复杂度 \(O(1)\)

      其实还有生成函数的推导方法

卡特兰数 学习笔记_子节点_04