杨表学习笔记
本文参考 袁方舟 《浅谈杨氏矩阵在信息学竞赛中的应用》
杨表
一.定义
杨表(Young tableaux)又称杨氏矩阵。
设有一个 \(n\) 的整数拆分 \(\lambda = (\lambda_1, \lambda_2, \dots, \lambda_m), \sum\limits_{i = 1}^{m}\lambda_i = n\),满足 \(\lambda_i \geq \lambda_{i+1}\)。称为 \(\lambda \vdash n\)。
杨图:一个形状为 \(\lambda\) 的杨图是一个表格,,第 \(i\) 行有 \(\lambda_i\) 个方格,分别为 \((i, 1),(i,2),\dots,(i,\lambda_i)\), 与 Ferrers 图类似。
标准杨表:讲 \(1, 2, \dots, n\) 的数填入杨图,满足每行每列元素单调递增的图案,例如:
\(\begin{bmatrix} 1 \ \ 4 \ \ 7 \ \ 8 \\ 2 \ \ 5 \ \ 10 \ \ \\ 3 \ \ 9 \ \ \ \ \ \ \ \ \\ 6 \ \ \ \ \ \ \ \ \ \ \ \ \end{bmatrix}\)
半标准杨表:将杨图填入数字,满足每行单调不降,每列单调递增的方案
二.杨表的插入和删除
1.RSK算法
当插入一个数 \(x\) 时,从第一行开始找第一个大于 \(x\) 的数。若不存在则插入末尾并退出;否则设该数为 \(y\), 交换 \(x,y\), 并对下一列继续操作。
正确性显然,代码也非常简单。
对于删除,我们只希望将处在边界 \((x,y)\)(一个位置 \((x,y)\) 被认为是边界,当且仅当 \((x+1,y)\) 和 \((x,y+1)\) 都没有数)删除,可以看做插入操作的逆操作。
删除一个处在 \(i\) 行位置的 \(x\) 时,当 \(i = 1\) 直接退出;否则,找到上一行最大的小于 \(x\) 的数 \(y\), 交换 \(x,y\), 并移步至上一行。
容易发现,当最后一次插入的位置为 \((x,y)\) 时,若我们删除 \((x,y)\),则杨表还原为插入前的模样。
2.记录表
对于排列 \(p_i\) 而言,设当前插入位置为 \((x,y)\),定义 \(P\) 为 \(p_i\) 顺序插入得到的杨表,\(Q\) 为在 \((x,y)\) 插入对应下标 \(i\) 得到的杨表,称为记录表,并维持 \(Q\) 和 \(P\) 的形状相同。
例如:\(p_i = [1,5,3,2,6,7,4]\),\(P = \begin{bmatrix} 1 \ \ 2 \ \ 4 \ \ 7 \\ 3 \ \ 6 \ \ \ \ \ \ \ \ \\ 5 \ \ \ \ \ \ \ \ \ \ \ \ \end{bmatrix}\),\(Q = \begin{bmatrix} 1 \ \ 2 \ \ 5 \ \ 6 \\ 3 \ \ 7 \ \ \ \ \ \ \ \ \\ 4 \ \ \ \ \ \ \ \ \ \ \ \ \end{bmatrix}\).
定理 2.1(Robinson-Schensted correspondence):
一个 1 到 \(n\) 的排列 \(p_i\) 与一对形状相同的标准杨表形成双射,也就是说,设 \(f_{\lambda}\) 为形状为 \(\lambda\) 的填数方案,有:
\[\sum\limits_{\lambda \vdash n}f_{\lambda}^2 = n! \]
Proof:对于一个排列 \(p_i\),有唯一对应的 \(P\) 和 \(Q\)。反过来,给定杨表 \(P,Q\),通过在 \(P\) 中不断删去 \(Q\) 中最大的元素(为 \(p_i\) 的最后一个元素),唯一对应一个排列。
三.杨表与对称矩阵
一个大小为 \(n \times m\) 的矩阵 \(A\) 可以看做若干个数对 \((i,j)\),其中 \((i,j)\) 出现了 \(A_{i,j}\) 次。
定义数对之间的比较为 \((a,b) \leq (c,d)\) 当且仅当 $a <c \or (a = c \and b \leq d) $。
那么一个矩阵可以看做若干个排序后的数对的排列,例如:
\(A = \begin{bmatrix} 0 \ \ 1 \ \ 0 \\ 0 \ \ 0 \ \ 2 \\ 1 \ \ 1 \ \ 0\end{bmatrix} \rightarrow \begin{bmatrix} 1 \ \ 2 \ \ 2 \ \ 2 \ \ 3 \\ 2 \ \ 3 \ \ 3 \ \ 1 \ \ 2\end{bmatrix}\) 。
定理 3.1:一组 \((u_1,v_1) \leq (u_2,v_2) \leq \dots \leq (u_k,v_k)\) 的序列对与一对相同形状的半标准杨表一一对应,此时的 \(P\) 为对第二行 \(v_i\) 进行操作得到的杨表,\(Q\) 为记录下的 \(u_i\)。
例如:$ \begin{bmatrix} 1 \ \ 2 \ \ 2 \ \ 2 \ \ 3 \ 2 \ \ 3 \ \ 3 \ \ 1 \ \ 2\end{bmatrix} \rightarrow P = \begin{bmatrix} 1 \ \ 2 \ \ 3 \ 2 \ \ 3 \ \ \ \ \end{bmatrix} \ \ \ \ Q = \begin{bmatrix} 1 \ \ 2 \ \ 2 \ 3 \ \ 3 \ \ \ \ \end{bmatrix}$
进一步观察,我们可以得到:
按如下操作将序列对分成若干组:初始包含 \(u_1,v_1\)(当前的),设当前长度为 \(m\),若 \(v_i < v_m\) 则加入 \(i\) 。依次操作得到的集合记作 \(A_i\)。然后在原数组中删除 \(A_i\)。
则杨表 \(P\) 的第一行第 \(i\) 个元素为 \(A_{i,1}\),杨表 \(Q\) 的第一行第 \(i\) 个元素为 \(A_{i,siz_i}\)。
定理 3.2:设 \(X = \begin{bmatrix} u_1 \ \ u_2 \dots u_k \\ v_1 \ \ v_2 \dots v_k\end{bmatrix},X^{-1} = \begin{bmatrix} v_{i_1} \ \ v_{i_2} \dots v_{i_k} \\ u_{i_1} \ \ u_{i_2} \dots u_{i_k} \end{bmatrix}\),则 \((P_X,Q_X) =(Q_{X^{-1}},P_{X^{-1}})\)。
定理 3.3:一个 \(n \times n\) 的对称矩阵 \(M\) 与一个半标准的 \(P_{M}\) 一一对应。
\(\begin{bmatrix} 0 \ \ 1 \ \ 0 \ \ 0 \ \ 0 \\ 1 \ \ 0 \ \ 0 \ \ 2 \ \ 0 \\ 0 \ \ 0 \ \ 0 \ \ 0 \ \ 0 \\ 0 \ \ 2 \ \ 0 \ \ 0 \ \ 0 \\ 0 \ \ 0 \ \ 0 \ \ 0 \ \ 1 \end{bmatrix} \rightarrow X = \begin{bmatrix} 1 \ \ 2 \ \ 2 \ \ 2 \ \ 4 \ \ 4 \ \ 5 \\ 2 \ \ 1 \ \ 4 \ \ 4 \ \ 2 \ \ 2 \ \ 5\end{bmatrix} \rightarrow P_X = Q_X = \begin{bmatrix} 1 \ \ 2 \ \ 2 \ \ 5\\ 2 \ \ 4 \ \ 4 \ \ \ \ \end{bmatrix}\)
Proof:由于 \(M\) 为对称矩阵,因此 \(X_M = X_{M^{T}}\)。
定理 3.4 定义一个 \(n \times n\) 矩阵 \(M\) 的迹为 \(\mathrm{tr}(M) = \sum\limits_{i = 1}^{n}M_{i,i}\)。则若 \(M\) 为对称矩阵,\(M\) 对应的半标准杨表 \(P_M\) 中长度为奇数的列数 $ = \mathrm{tr}(M)$。
对合排列
如果一个矩阵每一行每一列都恰好有一个数且和为 1,那么这个矩阵就是一个排列。这样一个矩阵对应的杨表为标准杨表。
若一个 1 到 \(n\) 的排列 \(p_i\) 满足所有置换长度 \(\leq 2\),则称 \(p_i\) 为一个对合排列。
一个对合排列 \(p_i\), 交换 \(p_i\) 和 \(p_{p_i}\) 后排列不变。可以看做 \(M = M^{T}\)。
定理 3.4 :大小为 \(n\) 的标准杨表个数与长度为 \(n\) 的对合排列数形成双射。
该定理给出了大小为 \(n\) 的标准杨表的递推公式:\(f_n = f_{n-1}+(n-1)f_{n-2}\)。
四.杨表与 LIS
LIS(Longest Increasing Subsequence)为最长上升子序列。
回顾杨表插入的过程,我们发现,杨表的第一行就是 LIS 长度(当然对应位置的值不一定相同)。
若需要求 \(k\) 个不相交的 LIS,即是杨表前 \(k\) 行的长度。
例:
[CTSC2017]最长上升子序列
根据 Dilworth 定理,最小链覆盖等于最长反链,故 LIS 不超过 \(k\) 的子序列可以看做不超过 \(k\) 个 LDS 序列的最长长度。
直接暴力插入元素是 \(O(n^2 \log n)\) 的,考虑优化。
我们考察将一个排列顺序加入和逆序加入形成的杨表,例如 \([2,4,1,5,3]\) 为:\(\begin{bmatrix} 1 \ \ 3 \ \ 5 \\ 2 \ \ 4 \ \ \ \ \end{bmatrix}\) 和 \(\begin{bmatrix} 1 \ \ 2 \\ 3 \ \ 4 \\ 5 \ \ \ \ \end{bmatrix}\),会发现它们互为共轭关系。
对于杨表中的一个元素 \((x,y)\),显然 \(x,y\) 至少有一者 \(\leq \sqrt{n}\)。因此,我们考虑只维护前 \(\sqrt n\) 的杨表。对于 \(l > \sqrt n\) 的杨表,我们维护其转置,也就是若在 \((x,y)\) 插入元素(\(y > \sqrt n\)),就把第 \(y\) 行元素 + 1。
因此维护两个杨表即可,查询可以用树状数组维护。
时间复杂度 \(O(n \sqrt n \log n+q \log n)\)。
五.杨表钩子公式
对于一个杨图 \(\lambda\) 而言,一个位置 \((x,y)\) 的钩子(hook)等于其右边和下边的元素个数 + 1,记做 \(h_{\lambda}(x,y)\)。
由于该函数的计数区域类似一个钩子,所以称为钩子公式。
定理 5.1(钩子公式):
\[f_{\lambda} = \dfrac{n!}{\prod h_{\lambda}({i,j})} = n!\dfrac{\prod\limits_{1 \leq i < j \leq m}(\lambda_i - i -\lambda_j+j)}{\prod\limits_{i = 1}^{m}(\lambda_i+m - i)!} \]
可以看做有 \(\dfrac 1{h_{\lambda}(x,y)}\) 的概率选出的最小数为 \((x,y)\), 把所有位置的概率相乘就是答案。
例:[BJWC2018]最长上升子序列
由于一个排列的 LIS 长度为杨表第一行长度,我们拆分数枚举可能的杨表形状 \(\lambda \vdash n\),根据钩子公式算出排列个数的平方就是答案。
一个很有用的事实是 :拆分数 \(p(n) \sim \dfrac{1}{4n\sqrt 3}\exp(\pi\sqrt{\dfrac{2n}3})\),