CSP 初赛

日期:
標籤: oi

主定理

对于一个递推关系式子:T(n)=aT(nb)+f(n)T(n) = aT(\frac{n}{b}) + f(n)。其复杂度为:

参考维基百科,与算法导论对应章节。

其实就是找 aT(nb)aT(\frac{n}{b})f(n)f(n) 两个部分复杂度较大的。

复杂度记号

poly(n)\mathrm{poly}(n) 指和 nn 有关的多项式,同理 polylog(n)\mathrm{polylog}(n) 实际上就是 poly(logn)\mathrm{poly}(\log n),即和 logn\log n 有关的多项式。

错排问题

考虑容斥,若存在 ii 个数在原来的位置上,这种情况的数量是 (ni)(ni)!\binom{n}{i}(n-i)!,所以可以得到错排公式:

D(n)=i=0n(1)i(ni)(ni)!=i=0n(1)in!i!=n!i=0n(1)ii!\begin{aligned} D(n) &= \sum_{i=0}^{n} (-1)^{i} \binom{n}{i}(n-i)! \\ &= \sum_{i=0}^{n} (-1)^{i} \frac{n!}{i!} \\ &= n! \sum_{i=0}^{n} \frac{(-1)^{i}}{i!} \end{aligned}

也可以考虑递推,对于第 nn 个数,假设它被放到位置 ii 构成错排,考虑第 ii 个数的位置:

故得到递推公式:D(n)=(n1)[D(n1)+D(n2)]D(n)=(n-1)[D(n-1)+D(n-2)]

OEIS: A000166

卡特兰数

从最经典的出栈序列计数开始。将入栈记作 -1,出栈记作 +1,可以得到一个长度为 2n 的序列,一个合法的出栈序列满足其任意一个前缀和非负,且总和为 0。

考虑统计不合法的出栈序列。对于任意一个不合法的出栈序列,找到第一个满足前缀和等于 -1,的位置 p,将 p 之前的所有数翻转,即 -1 变为 +1,+1 变为 -1,得到一个长度为 2n 且有 n+1 个 +1,n-1 个 -1 的序列。容易得到对于任意一个有 n+1 个 +1,n-1 个 -1 的序列都能对应一个不合法的出栈序列,这是个双射。故不合法序列的总数为 (2nn+1)\binom{2n}{n+1},总共合法序列的数量为 (2nn)(2nn+1)=(2nn)n+1\binom{2n}{n} - \binom{2n}{n+1} =\frac{\binom{2n}{n}}{n+1}

OEIS: A000108

Twelvefold way

nn 个球,xx 个盒子。

nn 个有标号球放入 xx 个有标号盒子

xnx^{n}

nn 个有标号球放入 xx 个有标号盒子,每个盒子至多一个球

xnx^{\underline n}

nn 个有标号球放入 xx 个有标号盒子,每个盒子至少一个球

x!{nx}x! \begin{Bmatrix} n \\ x \end{Bmatrix}

第二类斯特林数统计的是不区分盒子时的数量,乘上 x!x! 表示考虑 xx 个盒子的顺序。

nn 个无标号球放入 xx 个有标号盒子

(n+x1x1)\binom{n+x-1}{x-1}

每个盒子预先放上一个球,即转化为 n+xn+x 个无标号球放入 xx 个有标号盒子,每个盒子至少一个球。

nn 个无标号球放入 xx 个有标号盒子,每个盒子至多一个球

(xn)\binom{x}{n}

考虑哪些盒子放了球。

nn 个无标号球放入 xx 个有标号盒子,每个盒子至少一个球

(n1x1)\binom{n-1}{x-1}

插板法,考虑 nn 个球之间有 n1n-1 个空位,在这些空位中插入 x1x-1 个分隔。

nn 个有标号球放入 xx 个无标号盒子

i=0k{ni}\sum_{i=0}^{k} \begin{Bmatrix} n \\ i \end{Bmatrix}

盒子是可空的,所以枚举有多少个盒子空,转化为每个盒子至少一个球的问题。

nn 个有标号球放入 xx 个无标号盒子,每个盒子至多一个球

[nx][n \le x]

nn 个有标号球放入 xx 个无标号盒子,每个盒子至少一个球

{nx}\begin{Bmatrix} n \\ x \end{Bmatrix}

第二类斯特林数就是这样定义的。

计算第二类斯特林数,有递推公式:

{nx}={n1x1}+x{n1x}\begin{Bmatrix} n \\ x \end{Bmatrix} = \begin{Bmatrix} n-1 \\ x-1 \end{Bmatrix} + x \begin{Bmatrix} n-1 \\ x \end{Bmatrix}

考虑第 nn 个球应该放在哪里。如果它单独放一个盒子,那么就是转化为 {n1x1}\begin{Bmatrix} n-1 \\ x-1\end{Bmatrix};如果它放入一个现有的非空盒子,那么就是 x{n1x}x\begin{Bmatrix} n-1 \\ x \end{Bmatrix}

nn 个无标号球放入 xx 个无标号盒子

px(n+x)p_{x}(n+x)

每个盒子预先放上一个球,即转化为 n+xn+x 个无标号球放入 xx 个有标号盒子,每个盒子至少一个球。

nn 个无标号球放入 xx 个无标号盒子,每个盒子至多一个球

[nx][n \le x]

nn 个无标号球放入 xx 个无标号盒子,每个盒子至少一个球

px(n)p_{x}(n)

相当于将 nn 拆分成恰好 xx 个正整数的方案数。

计算 px(n)p_{x}(n),有转移方程:

px(n)=px(nx)+px1(n1)p_{x}(n) = p_{x}(n-x) + p_{x-1}(n-1)

即考虑拆分方案中不存在 11 和存在 11 的情况。如果不存在 11,那么把方案中所有数减一,转化为 px(nx)p_{x}(n-x);如果存在 11,那么去掉这个 11,转化为 px1(n1)p_{x-1} (n-1)

命令

就列一些常用的。我非常反感考这种东西。

历史

2023 年,第 40 届 NOI,第 29 届 NOIp,第 35 届 IOI,第 5 届 CSP。

ASCII

哈夫曼树

  1. 对于给定的 nn 个权值,先建立 nn 个有 11 个节点的树。
  2. 不断进行以下操作,直到剩下 11 棵树:
    1. 选取权值最小的两棵树 AABB,将他们分别为左右子树,构造一颗新的树,其权值为 AA 的权值加 BB 的权值。
    2. 删除 AABB

补码

对于一个长度为 nn 的二进制数 xx,其补码为 xmod2nx \bmod 2^n