本文大量参考袁方舟的论文《浅谈杨氏矩阵在信息学竞赛中的应用》。
Part 1 定义
定义 1.1(拆分)
定义正整数 n 的拆分 λ[1,k]={λ1,λ2,…,λk},其需要满足:
- ∀1≤i≤k,都有 λi∈N+;
- n=i=1∑kλi;
- ∀1≤i<k,都有 λi≥λi+1;
定义 1.2(杨图)
对于一个 n 的拆分 λ[1,k],定义其对应的杨图为一个 k 行的阶梯状网格图,满足第 i 行有 λi 个格子。
例如这是 λ[1,8]={9,9,7,3,3,3,3,1} 对应的杨图:
定义 1.3.1(标准杨表)
将 [1,n] 填入 λ[1,k] 对应杨图的格子中,满足每行严格递增且每列严格递增。
例如:
不难发现一个标准杨表的任意子表(选若干行若干列取交点,类比子矩阵)都是标准杨表。
定义 1.3.2(半标准杨表)
允许数字重复的杨表,满足每行不严格递增且每列严格递增。
于标准杨表相同,一个半标准杨表的任意子表都是半标准杨表。
定义 1.3.3(斜杨图)
对于 n 的拆分 λ[1,k1] 和 m 的拆分 μ[1,k2],若 k2≤k1 且 ∀1≤i≤k2 均有 μi≤λi,那么定义斜杨图 λ/μ 为 λ 对应的杨图扣掉 μ 对应的杨图得到的网格图:
类似地,定义标准斜杨表和半标准斜杨表。
同前文,子表仍满足对应性质。
Part 2 RSK 算法和 RS 双射
RSK 算法构建了排列和有序标准杨表对间的双射——RS 双射。
算法 2.1.1(RSK 行插入算法)
对于一个标准杨表 S,定义插入一个未在 S 中出现的数 x 的算法 S←x:
- 若 S 为空,则在 S 中加入 x,插入结束;
- 找到 S1,∗(第一行)中第一个 >x 的数 S1,i:
- 若找不到则在 S1,∗ 右端加入 x,插入结束;
- 若找到了,则用 x 顶替掉 S1,i,递归向子表 S≥2,∗(即删掉第一行)中行插入原来的 S1,i;
一个例子:
对于行插入,不难发现一些性质:
- S←x 过程中顶替掉的数字的列号单调不增;
- S←x 是标准杨表;
类似地,定义列插入算法:
算法 2.1.2(RSK 列插入算法)
对于一个标准杨表 S,定义列插入 x 算法 x→S(需保证 x 未在 S 中出现):
- 若 S 为空,则在 S 中加入 x,插入结束;
- 找到 S∗,1(第一列)中第一个 >x 的数 Si,1:
- 若找不到则在 S∗,1 下端加入 x,插入结束;
- 若找到了,则用 x 顶替掉 Si,1,递归向子表 S∗,≥2(即删掉第一列)中行插入原来的 Si,1;
其具有和行插入类似的性质。
接下来定义行删除算法:
算法 2.2.1(RSK 行删除算法)
对于一个标准杨表 S,定义行删除 Ss,t 的算法,要求 (s,t) 是 S 的一个“边角”:
- 令 x=Ss,t,删去格子 (s,t),令当前行 i=s−1;
- 若 i=0 则删除结束;
- 否则
- 找到 Si,∗ 中最后一个 <x 的数 Si,j,根据标准杨表的性质,这样的数必定存在;
- 交换 Si,j 和 x,令 i:=i−1,回到第一步;
一个例子:
不难发现行删除是行插入的逆操作,具体的,行删除每次替换掉的数恰好是行插入每次顶替掉的数。
类似定义列删除算法。
类似地,定义半标准杨表中的行插入和列插入算法,行插入算法不变,列插入算法仅需在顶替数字的时候更改为找到第一个 ≥x 的数。而半标准杨表中的行删除或列删除算法也是类似的,显然也和对应的插入算法互逆。
接下来我们定义一个排列到标准杨表对的双射:
定义 2.1.1(RS 双射)
对于一个排列 p[1,n],定义标准杨表对 (Pp,Qp),其中 Pp=((…((p1←p2)←p3)←…)←pn),即依次行插入 p1,p2,…,pn 得到的标准杨表。而 Qp 为一个形状和 Pp 相同的标准杨表,但 Qp 中 (i,j) 上的数表示该格子是在第几次行插入中被创建的。
显然 Pp 和 Qp 都是标准杨表。
RS 双射指出,排列 p[1,n] 和有序标准杨表对 (Pp,Qp) 一一对应,即有:
n!=∣S∣=n∑count2(S)
其中 S 为杨图,count(S) 表示该杨图对应的标准杨表个数。
证明考虑显然 p 可以唯一确定 (Pp,Qp),而由于行删除是行插入的逆操作,故可以根据 Qp 记录的信息不断对 Pp 执行行删除,从而求出 p。故该映射为双射。
Part 3 矩阵、递增坐标序列和半标准杨表
定义 3.1(递增坐标序列)
对于两个二维坐标 (a,b),(c,d),定义 (a,b)≤(c,d) 当且仅当 a<c 或 a=c,b≤d(即 pair<int,int>
的比较)。
定义一个递增坐标序列 {(u1,v1),(u2,v2),…,(uk,vk)} 需要满足 ∀1≤i<k 都有 (ui,vi)≤(ui+1,vi+1)。
不难发现排列就是 (ui,vi)=(i,pi) 的递增坐标序列。
对于递增坐标序列 a,我们可以重定义一下 RS 双射,改为 Pa 由依次行插入 vi 得到,而 Qa 的格子 (i,j) 上填入新增该格子对应的插入操作 (ui,vi) 的 ui:
显然 Pa 和 Qa 都是半标准杨表。
那么仍然有双射 a↔(Pa,Qa),即递增坐标序列和半标准杨表对构成双射。
接下来,考虑定义递增坐标序列的逆:
定义 3.1.1(递增坐标序列的逆)
对于一个递增坐标序列 a[1,k]={(ui,vi)},定义其逆为 a[1,k]−1 为 {(vi,ui)} 递增排序后的结果。
显然 a−1 也是递增坐标序列。
考虑更加形象地描述递增坐标序列和其逆。定义递增坐标序列和(无限)矩阵之间的双射:
定义 3.2(递增坐标序列和矩阵)
对于一个递增坐标序列 a,其对应的矩阵 A 满足 Ai,j 为 (i,j) 在 a 中的出现次数。
不难发现这是一个双射。
根据这个定义,不难发现 a−1 对应的矩阵为 AT,即 A 的转置。
由此,可以进一步导出一个结论:
定理 3.1
对于一个递增坐标序列 a,有:
(Pa,Qa)=(Qa−1,Pa−1)
证明考虑在矩阵 A 上定义 (PA,QA) 为其对应递增坐标序列 a={(ui,vi)} 的 (Pa,Qa)。
接下来先假设 Ai,j∈{0,1},考虑 PA 和 QA 的第一行,下文暂时省略下标 A。
注意到插入过程相当于从上到下从左往右逐个位置扫描 A,若扫到 Ai,j=1 则插入 (i,j)。
考虑 P1,1 的变化,不难发现它刚开始为 v1,之后每次遇到一个 <P1,1 的 vi 都会更新 P1,1:=vi,在矩阵上则形如从最高最左的 1 开始往左下的一条链。而 P1,2 的变化也是类似的,相当于删掉 P1,1 对应链上的元素后递归下去。P1,>2 也都是类似的:
上图中红色、蓝色和绿色分别为 P1,1、P1,2 和 P1,3 对应的链。
不妨按照时间顺序定义链的头尾,那么 P1,∗ 就是其对应链链尾 (i,j) 的列坐标 j。
接下来考虑 Q 的第一行,显然 Q1,∗ 就是 P1,∗ 对应链链头 (i,j) 的行坐标 i。
不难发现转置后每条链都会恰好反向,即链头和链尾交换,且每个点的行列坐标互换了。所以转置后 P1,∗ 和 Q1,∗ 恰好交换了。
接下来考虑 P2,∗ 和 Q2,∗(第二行),我们首先考察哪些元素会往 P≥2,∗ 这个子表中插入,然后试着套用第一行的思路。
不难发现,往 P≥2,∗ 插入的元素一定是被从第一行顶下来的,而每条长 k 的链的前 k−1 个元素都会被后一个元素顶下来。具体的,对于一条链 (u1,v1),(u2,v2),…,(uk,vk),被顶下去的元素为 v[1,k−1]。
而由于 Q 中记录的是插入时的 ui,所以 vi 被顶下去相当于向 (P≥2,∗,Q≥2,∗) 插入 (ui+1,vi),那么该链对 (P≥2,∗,Q≥2,∗) 的影响相当于插入了 (u2,v1),(u3,v2),…,(uk,vk−1),在矩阵上表现为相邻两个点的“角落”:
那么设这些“角落”对应的矩阵为 M,显然 (P≥2,∗,Q≥2,∗)=(PM,QM),而 AT 对应的“角落”显然是 MT,那么归纳证明即可。
而存在 Ai,j>1 的情况也是类似的,可以通过将 ui 重标号转化为 Ai,j∈{0,1} 的情况。
Part 3.1 对称矩阵和对合排列
当 Ai,j=Aj,i 即 A=AT 时,我们称 A 为对称矩阵。
那么显然 PA=QA,故对称矩阵和半标准杨表构成双射。
接下来还有一个不那么显然的结论:
- A 对应的每条链 (u1,v1),(u2,v2),…,(uk,vk) 都是回文的;
证明较为简单。
而对合排列就是满足 ppi=i 的排列,即置换环大小 ∈{1,2}。显然对合排列对应的矩阵 A 满足 A=AT 且其每行每列都只有一个 1。故对合排列和标准杨表构成双射。
那么这就导出了标准杨表个数公式:
定理 3.1.1(标准杨表个数公式)
定义大小为 n 的标准杨表个数为 fn,则有:
fn=⎩⎪⎨⎪⎧12fn−1+(n−1)fn−2n=1n=2n≥3
这个式子相当于枚举 n 是自环还是和别人配对。
Part 4 杨表与 LIS
LIS:最长上升子序列
LDS:最长下降子序列
本节仅讨论排列(元素不重复的序列)的情况,对于元素有重复的序列,可以通过重标号使得其元素不重复。
定理 4.1
一个排列 p 的 LIS 长度为 Pp 第一行的长度。
证明考虑 Pp 第一行的变化相当于经典的使用二分 O(nlogn) 求 LIS 的过程。
值得注意的是,Pp 的第一行并不一定就是 p 的 LIS 本身,故不能用杨表做 LIS 划分之类的问题。
引理 4.2
对于一个杨表 S 和两个元素 x,y,有 x→(S←y)=(x→S)←y。
定义杨表 S 的转置 ST 为交换 S 的行列后得到的杨表,则 S←x=(x→ST)T,列插入同理。
第一点证明是简单的,考虑插入过程中顶替掉的格子形成的路径,显然行插入的路径是斜向左下的,而列插入的路径是斜向右上的,然后分讨一下 x,y 间大小关系即可。
而第二点是显然的。
由此引理,我们得以导出 Pp 和 PpR 间的关系。
定理 4.2
对于一个排列 p,定义 pR 为其头尾翻转形成的排列(piR=pn−i+1)。
那么有 Pp=PpRT。
注意该定理对 Q 不成立。
证明考虑归纳,∣p∣=2 时显然成立。
对于 n=∣p∣>2 的情况,有:
Pp=Pp[1,n−1]←pn=Pp[1,n−1]RT←pn=(p1→Pp[2,n−1]RT)←pn=p1→(Pp[2,n−1]RT←pn)=p1→(Pp[2,n−1]←pn)=p1→Pp[2,n]=p1→Pp[2,n]RT=PpRT
故成立。
该定理还有一个拓展:
定理 4.2.1(O(nnlogn) 求杨表)
定义 pi−=−pi,Pp=−Pp−T。
证明方法类似。
根据这个定理,我们得以在线地快速求出一个排列 p 的 (P,Q)。具体的,对于一个大小为 n 的杨表中的格子 (x,y),一定有 x≤n 或 y≤n,故仅需求出其前 n 行和前 n 列再并起来即可。
前 n 行是简单的,暴力插入即可。而对于前 n 列,应用该定理后相当于插入 −pi 得到的杨表的前 n 行,故也可以维护。
那么总复杂度是 O(nnlogn) 的。
定理 4.3
一个排列 p 的 LDS 长度为 Pp 第一列的高度。
根据定理 4.2,pR 的 LIS 长度为 Pp 第一列的高度,而显然 pR 的 LIS 是由 p 的 LDS 翻转得到的,故成立。
Part 4.1 最长 k-LIS 子序列
定义 4.1.1(k-LIS 序列和 k-LDS 序列)
定义一个序列为 k-LIS 序列当且仅当其 LIS 长度不超过 k。
同理定义 k-LDS 序列。
显然最长 1-LIS 就是原序列的 LDS,即杨表第一列的高度。
这引导我们作出猜想:
定理 4.1.1(最长 k-LIS 子序列长度)
对于排列 p:
懒得证了,感性理解一下,去看论文吧。
例题:P3774 [CTSC2017] 最长上升子序列
Part 5 钩子公式
接下来回答一个一直悬而未决的问题:
对于一个大小为 n 的杨图 λ,其有多少个对应的标准杨表?
定理 5.1(钩子公式)
对于一个杨图 S,定义 h(i,j) 为 Si,j 右方的格子的个数加上其下方的格子的个数再 +1 的值((i,>j)+(>i,j)+(i,j),形如一个钩子),则该 S 对应的标准杨表共有 ∏h(i,j)n! 种。
证明 5.1(钩子公式)
考虑归纳。
n=1 时显然成立,现在假设对于 [1,n−1] 均成立,来证明对于 n 成立。
显然 n 填入的位置一定是“边角”,并且一个杨图挖掉边角后还是杨图。
那么设 Xi=(ai,bi) 为 λ 从上往下第 i 个边角的位置,μ(i) 为 λ 挖掉 Xi 后得到的 n−1 的杨图,则我们要证明:(m 是边角的个数)
∏h(i,j)λn!=i=1∑m∏h(i,j)μ(i)(n−1)!
也即:
i=1∑m∏h(i,j)μ(i)∏h(i,j)λ=n
接下来,我们只考虑 λ 的杨图。定义 ct(i,j)=i−j,并且对于 i∈[0,m] 定义 Yi=(ai,bi+1),并定义 a0=b0=bm+1=0,X0=(0,0):
再令 D(i,j) 和 R(i,j) 为从 (i,j) 开始不停往下走和往右走最终到达的格子,那么有 h(i,j)=ctD(i,j)−ctR(i,j)+1。
令 xi=ctXi,yi=ctYi,则有:
i=0∑mxi=i=0∑myi
这是因为 xi=ai−bi,yi=ai−bi+1,b 错位抵消后仅剩 bm+1−b0=0。
接下来考虑证明:
i=1∑m∏h(i,j)μ(i)∏h(i,j)λ=−i=1∑mj=1,j=i∏m(xi−xj)j=0∏m(xi−yj)
证明
考虑添加边角 Xi 的影响 ∏h(i,j)μ(i)∏h(i,j)λ,显然只会影响到 (ai,∗) 和 (bi,∗)。
对于同一列的影响,实际上只有 Lj=(aj,bi)(1≤j<i)和 Mj=(aj+1,bi)(0≤j<i)这些格子对这个分数有贡献:(其它的都会错位相消)
更具体的,只有 Mj 会对分子造成影响,且只有 Lj 会对分母造成影响。
注意到:(考虑 Xi 和 Yi 的位置)
hMjλ=h(aj+1,bi)λ=ctD(aj+1,bi)−ctR(aj+1,bi)+1=xi−yjhLjμ(i)=h(aj,bi)λ−1=ctD(aj,bi)−ctR(aj,bi)=xi−xj
相似的,对于同一行的影响,有 Lj=(ai,bj)(i<j≤m),Mj=(ai,bj+1+1)(i≤j≤m),且:
hMjλ=yj−xihLjμ(i)=xj−xi
那么有:
∏h(i,j)μ(i)∏h(i,j)λ=∏hLjμ(i)∏hMjλ=1≤j<i∏(xi−xj)i<j≤m∏(xj−xi)0≤j<i∏(xi−yj)i≤j≤m∏(yj−xi)=−j=1,j=i∏m(xi−xj)j=0∏m(xi−yj)
证毕。
然后我们将证明:
−i=1∑mj=1,j=i∏m(xi−xj)j=0∏m(xi−yj)=−21i=0∑mxi2−yi2
证明
注意到这个式子很像拉插,所以不妨设:(不知道怎么想到的)
P(t)=−i=1∑mj=1,j=i∏m(xi−xj)j=0∏m(xi−yj)j=1,j=i∏m(t−xj)Q(t)=i=0∏m(t−yi)
那么 P(t) 是 m−1 次多项式,Q(t) 是 m+1 次多项式,我们要求的值就是 [tm−1]P(t)。
注意到 P(t)+Q(t) 在 t=xi(i=0)时为 0,且 xi 互不相同(每斜行恰好有一个边角),且 [tm+1](P(t)+Q(t))=1,故存在 α 使得:
P(t)+Q(t)=(t+α)i=1∏m(t−xi)
那么:
P(t)=(t+α)i=1∏m(t−xi)−i=0∏m(t−yi)=(α−i=1∑mxi+i=0∑myi)tm+(−αi=1∑mxi+1≤i<j≤m∑xixj−0≤i<j≤m∑yiyj)tm−1+…
根据之前的结论,有:
i=0∑mxi=i=0∑myi
且 x0=0,那么 i=0∑myi−i=1∑mxi=0,所以 α=0。
故 [tm−1]P(t)=1≤i<j≤m∑xixj−0≤i<j≤m∑yiyj=0≤i<j≤m∑xixj−yiyj。
继续:
0≤i<j≤m∑xixj−yiyj=21⎝⎛(i=0∑mxi)2−i=0∑mxi2−(i=0∑myi)2+i=0∑myi2⎠⎞=21i=0∑myi2−xi2=−21i=0∑mxi2−yi2
证毕。
那么代入 xi=ai−bi 和 yi=ai−bi+1,有:
−21i=0∑mxi2−yi2=−21i=0∑m(ai−bi)2−(ai−bi+1)2=−21i=0∑mai2−2aibi+bi2−ai2−bi+12+2aibi+1=−21i=0∑m−2aibi+bi2+2aibi+1−bi+12=−21(b02−bm+12+i=0∑m2ai(bi+1−bi))=i=0∑maibi+1−aibi
注意到这个实际上相当于将杨图竖着划分成很多个长方形加起来,结果就是杨图的面积,故:
n=i=0∑maibi+1−aibi
即证毕。