【Code】杨氏矩阵(杨表)

定义

λ = ( λ 1 , λ 2 , ⋯   , λ m ) \lambda=(\lambda_1,\lambda_2,\cdots,\lambda_m) λ=(λ1,λ2,,λm)​是 n n n​的一个整数拆分(记为 λ ⊢ n \lambda \vdash n λn​),一个形状为 λ \lambda λ​的杨图为 m m m​行,第 i i i​行有 λ i \lambda_i λi​列的一个表格。

而一个形状为 λ \lambda λ的标准杨表为将 1 ∼ n 1\sim n 1n填入杨图中,使得的每行、每列严格递增。

若填入的数有重复,但满足同一行中的数字非严格递增,且同一列中的数字严格递增的杨表被称作是半标准杨表。

将杨表中每个数字出现的次数记录下来,可得到一个序列,该序列被视为杨表的“权重”。

对于两个整数拆分 λ \lambda λ​和 μ \mu μ,若对于所有 i i i都满足 λ i ≥ μ i \lambda_i\geq \mu_i λiμi,那么称一个形状为 λ / μ \lambda/\mu λ/μ的斜杨图为形状为 λ \lambda λ的杨图去掉 μ \mu μ的杨图。

类似的,我们定义标准斜杨表与半标准斜杨表。

RSK算法

插入算法:记 S ← x S\leftarrow x Sx表示将 x x x从第一行插入到杨表 S S S中,每次找到该行的upper_bound ,用 x x x替换,然后往下插入。如果找不到就直接插在末尾。

列插入:记 x → S x\rightarrow S xS表示将 x x x从第一列插入到杨表 S S S中,与行插入类似。

删除算法:将位置 ( i , j ) (i,j) (i,j)删去, ( i , j ) (i,j) (i,j)是一个边角。每次找到上一行的lower_bound,用 x x x替换,然后向上继续操作,到第一行直接退出。

对于一个排列 X X X,维护两个杨表 P X , Q X P_X,Q_X PX,QX,初始为空,之后按顺序进行 P X ← x i P_X\leftarrow x_i PXxi,记录插入时加入的格子在 Q X Q_X QX上赋值为 i i i,显然 Q X Q_X QX也为杨表。

由于插入和删除互为逆操作,所以从一对形状相同的 P , Q P,Q P,Q出发也可以造出一个排列。因此有:
∑ λ ⊢ n f λ 2 = n ! \sum_{\lambda\vdash n}f_{\lambda}^2=n! λnfλ2=n!
其中 f λ f_{\lambda} fλ表示形状为 λ \lambda λ的标准杨表个数。

杨表和LIS

显然 P X P_X PX​中第一行的长度就是 LIS \text{LIS} LIS的长度(但不一定就是 LIS \text{LIS} LIS


引理 ( x → S ) ← y = x → ( S ← y ) (x\to S)\gets y=x\to (S\gets y) (xS)y=x(Sy)

定理:对于排列 X X X 和杨表 P X P_X PX ,如果翻转 X X X 得到 X R X^R XR ,那么 P X R P_{X^R} PXR 即为 P P P 翻转行列得到。

定义 P ( x 1 , x 2 , ⋯ x n ) = ( ( x 1 ← x 2 ) ⋯   ) ← x n P(x_1,x_2,\cdots x_n)=((x_1\gets x_2)\cdots)\gets x_n P(x1,x2,xn)=((x1x2))xn P ′ ( x 1 , x 2 , ⋯   ) = x 1 → ( ⋯ ( x n − 1 → x n ) ) P'(x_1,x_2,\cdots)=x_1\to(\cdots(x_{n-1}\to x_n)) P(x1,x2,)=x1((xn1xn))

那么 P ( x 1 , x 2 , ⋯ x n ) P(x_1,x_2,\cdots x_n) P(x1,x2,xn)就是 X X X生成的杨表, P ′ P' P X R X^R XR的杨表翻转行列所得。

对于 n ≤ 2 n\leq 2 n2,显然成立。考虑归纳,若 n n n成立,那么:

P ( x 1 ∼ n , x n + 1 ) = P ′ ( x 1 ∼ n ) ← x n + 1 = x 1 → P ′ ( x 2 ∼ n + 1 ) = P ′ ( x 1 ∼ n + 1 ) P(x_{1\sim n},x_{n+1})=P'(x_{1\sim n})\gets x_{n+1}=x_1\to P'(x_{2\sim n+1})=P'(x_{1\sim n+1}) P(x1n,xn+1)=P(x1n)xn+1=x1P(x2n+1)=P(x1n+1)

由于 LDS \text {LDS} LDS就是 X R X^R XR LIS \text{LIS} LIS,所以 P X P_X PX的列就和 LDS \text{LDS} LDS有关。


最长的k-LIS子序列

定义  k-LIS \text{ k-LIS}  k-LIS序列为 LIS \text{LIS} LIS 长度不超过 k k k的序列。同理,定义  k-LDS  \text{ k-LDS }  k-LDS 序列表示$ \text{LDS} 长 度 不 超 过 长度不超过 k 的 序 列 。 显 然 , 最 长 的 的序列。显然,最长的 \text{1-LIS} 子 序 列 就 是 该 序 列 的 子序列就是该序列的 \text{LDS}$,这正是杨表的第一列;

我们可以猜想前 k k k列长度和就是最长的 k-LIS \text{k-LIS} k-LIS子序列长度。事实上,这也是正确的。

引理1:对于序列中三个连续的数 x , y , z   ( x < y < z ) x, y,z\,(x < y < z) x,y,z(x<y<z),如果它们在序列中不是按照 ( x , y , z ) ( z , y , x ) (x, y,z)(z, y, x) (x,y,z)(z,y,x) 出现的话,交换 x , z x,z x,z 后序列的最长 k-LIS \text{k-LIS} k-LIS 子序列长度不变。

考虑 ( z , x , y ) (z, x, y) (z,x,y)。注意到交换 x , z x,z x,z不会让长度增加。下面证明不会使得长度变短

G G G为原排列的最长 k-LIS \text{k-LIS} k-LIS子序列。如果 G G G不同时包含 x , z x,z x,z,那么交换 x , z x, z x,z后长度不会变短。若 G G G同时包含 z , x , y z,x,y z,x,y,交换后也长度不会变短。若 G G G 包含 z , x z,x z,x ,不包含 y y y ,这是不可能的,此时将 G G G中的 ( z , x ) (z,x) (z,x)替换为 ( z , y ) (z,y) (z,y)显然也合法。

其他类似。

引理2:对于排列 X X X 和它产生的杨表 P P P ,重组一个排列 X ′ = ( P m , 1 , ⋯   , P m , λ m , P m − 1 , 1 , ⋯   , P 1 , λ 1 ) X'=(P_{m,1},\cdots,P_{m,\lambda_m },P_{m-1,1},\cdots,P_{1,\lambda_1} ) X=(Pm,1,,Pm,λm,Pm1,1,,P1,λ1) ,那么 X X X 可以通过引理 1 1 1的交换操作转化成 X ′ X' X

归纳法,每插入一个就在当前的排列里模拟一遍。

通过这两个引理很容易证明上面的猜想。

例题:「CTSC2017」最长上升子序列

给出一个序列 B B B,每次询问给出 m , k m,k m,k,求 B 1 ∼ m B_{1\sim m} B1m的最长 k-LIS \text{k-LIS} k-LIS子序列。

n , q ≤ 50000 n,q\leq 50000 n,q50000

直接维护杨表是 O ( n 2 log ⁡ n ) O(n^2\log n) O(n2logn)的,但是我们可以注意到我们只关系前 n \sqrt{n} n 行和前 n \sqrt{n} n 列,维护行是容易的,对于列,我们维护 X R X^R XR的杨表即可,这样时间复杂度即为 O ( n n log ⁡ n ) O(n\sqrt{n}\log n) O(nn logn)

例题[BJWC2018]最长上升子序列

求长度为n的排列的最长上升子序列长度的期望。

直接枚举杨表形态即可,对于怎么数一个形态的杨表有多少个,见下文,复杂度为 O ( n p ( n ) ) O(np(n)) O(np(n)), p ( n ) p(n) p(n)为整数拆分数, 1 s 1s 1s大概能跑 60 60 60


杨表与钩子公式

λ = ( λ 1 , ⋯   , λ m ) \lambda=(\lambda_{1},\cdots,\lambda_m) λ=(λ1,,λm) n n n 的一个整数拆分,设 h λ ( i , j ) h_{\lambda}(i,j) hλ(i,j) 表示 ( i , j ) (i,j) (i,j) 正右边和正下方的格子数量。

先直接给出公式:

f λ = n ! ∏ h λ ( i , j ) f_{\lambda}={n!\over \prod h_{\lambda}(i,j)} fλ=hλ(i,j)n!

考虑归纳,设 λ \lambda λ n n n 的一个整数拆分,那么以它为形态的杨表中必须找到一个边角格子放 n n n ,而把这个 n n n 删去就会得到 n − 1 n-1 n1 的整数拆分 μ \mu μ 。记 μ → λ \mu\to \lambda μλ 当且仅当形状为 λ \lambda λ 的杨图包含形状为 μ \mu μ 的杨图,那么就要证明

n ! ∏ s ∈ λ h λ ( s ) = ∑ μ → λ ( n − 1 ) ! ∏ s ∈ μ h μ ( s ) ∑ μ → λ ∏ s ∈ λ h λ ( s ) ∏ s ∈ μ h μ ( s ) = n \frac{n !}{\prod_{s \in \lambda} h_{\lambda}(s)}=\sum_{\mu \rightarrow \lambda} \frac{(n-1) !}{\prod_{s \in \mu} h_{\mu}(s)} \\ \sum_{\mu \rightarrow \lambda} \frac{\prod_{s \in \lambda} h_{\lambda}(s)}{\prod_{s \in \mu} h_{\mu}(s)}=n sλhλ(s)n!=μλsμhμ(s)(n1)!μλsμhμ(s)sλhλ(s)=n

c = ( i , j ) , c t ( c ) = i − j c=(i,j),ct(c)=i-j c=(i,j),ct(c)=ij

λ \lambda λ 的所有边角拿出来,设从上往下分别是 X i = ( α i , β i )   ( 1 ≤ i ≤ m ) X_i=(\alpha_i,\beta_i)\,(1\le i\le m) Xi=(αi,βi)(1im) 。令 Y i = ( α i , β i + 1 )   ( 0 ≤ i ≤ m ) Y_i=(\alpha_i,\beta_{i+1})\,(0\le i\le m) Yi=(αi,βi+1)(0im) ,且 α 0 = β m + 1 = β 0 = 0 , X 0 = ( 0 , 0 ) \alpha_0=\beta_{m+1}=\beta_0=0,X_0=(0,0) α0=βm+1=β0=0,X0=(0,0) 。再设 A ( c ) , B ( c ) A(c),B(c) A(c),B(c) c c c 往下和往右走到最远的点,那么 h λ ( c ) = c t ( A ( c ) ) − c t ( B ( c ) ) + 1 h_{\lambda}(c)=ct(A(c))-ct(B(c))+1 hλ(c)=ct(A(c))ct(B(c))+1

x i = c t ( X i ) , y i = c t ( Y i ) x_i=ct(X_i),y_i=ct(Y_i) xi=ct(Xi),yi=ct(Yi) ,那么显然有 ∑ i = 0 m x i = ∑ i = 0 m y i \sum_{i=0}^m x_i=\sum_{i=0}^m y_i i=0mxi=i=0myi

μ ( i ) \mu^{(i)} μ(i) 加上 X i X_i Xi 得到 λ \lambda λ ,那么只有和 X i X_i Xi 同行同列,且在边角格子旁边的格子才会有影响。对于同列的格子,设 L j = ( α j , β i )   ( 1 ≤ j < i ) , M j = ( α j + 1 , β i )   ( 1 ≤ j < i ) L_j=(\alpha_j,\beta_i)\,(1\le j<i),M_j=(\alpha_j+1,\beta_i)\,(1\le j<i) Lj=(αj,βi)(1j<i),Mj=(αj+1,βi)(1j<i) ,那么只有它们才有贡献。有

h λ ( M j ) = c t ( A ( M j ) ) − c t ( B ( M j ) ) + 1 = x i − y j h μ ( i ) ( L j ) = c t ( A ( L j ) ) − c t ( B ( L j ) ) + 1 = x i − x j \begin{aligned} h_{\lambda}\left(M_{j}\right) =c t\left(A\left(M_{j}\right)\right)-c t\left(B\left(M_{j}\right)\right)+1=x_{i}-y_{j} \\ h_{\mu^{(i)}}\left(L_{j}\right) =c t\left(A\left(L_{j}\right)\right)-c t\left(B\left(L_{j}\right)\right)+1=x_{i}-x_{j} \end{aligned} hλ(Mj)=ct(A(Mj))ct(B(Mj))+1=xiyjhμ(i)(Lj)=ct(A(Lj))ct(B(Lj))+1=xixj

同行的格子同理,令 L i = ( α i , β j ) , ( i < j ≤ m ) , M i = ( α i + 1 , β j + 1 ) , ( i ≤ j ≤ m ) L_i=(\alpha_i,\beta_j),(i<j\leq m),M_i=(\alpha_i+1,\beta_{j+1}),(i\leq j\leq m) Li=(αi,βj),(i<jm),Mi=(αi+1,βj+1),(ijm)有:
h λ ( M j ) = y j − x i h μ ( i ) = x j − x i \begin{aligned} h_{\lambda}\left(M_{j}\right) =y_{j}-x_{i} \\ h_{\mu^{(i)}}=x_{j}-x_{i} \end{aligned} hλ(Mj)=yjxihμ(i)=xjxi

所以:
∑ μ → λ ∏ s ∈ λ h λ ( s ) ∏ s ϵ μ h μ ( s ) = ∑ i = 1 m ∏ s ∈ λ h λ ( s ) ∏ s ∈ μ ( i ) h μ ( i ) ( s ) = ∑ i = 1 m ∏ j = 0 m h λ ( M j ) ∏ j = 1 , j ≠ i m h μ ( i ) ( L j ) = ∑ i = 1 m ∏ j = 0 i − 1 ( x i − y j ) ∏ j = i m ( y j − x i ) ∏ j = 1 i − 1 ( x i − x j ) ∏ j = i + 1 m ( x j − x i ) = − ∑ i = 1 m ∏ j = 0 m ( x i − y j ) ∏ j = 1 , i ≠ j m ( x i − x j ) \begin{aligned} \sum_{\mu \rightarrow \lambda} \frac{\prod_{s \in \lambda} h_{\lambda}(s)}{\prod_{s \epsilon \mu} h_{\mu}(s)} &=\sum_{i=1}^{m} \frac{\prod_{s \in \lambda} h_{\lambda}(s)}{\prod_{s \in \mu^{(i)}} h_{\mu^{(i)}}(s)} \\ &=\sum_{i=1}^{m} \frac{\prod_{j=0}^{m} h_{\lambda}\left(M_{j}\right)}{\prod_{j=1, j \neq i}^{m} h_{\mu^{(i)}}\left(L_{j}\right)} \\ &=\sum_{i=1}^{m} \frac{\prod_{j=0}^{i-1}\left(x_{i}-y_{j}\right) \prod_{j=i}^{m}\left(y_{j}-x_{i}\right)}{\prod_{j=1}^{i-1}\left(x_{i}-x_{j}\right) \prod_{j=i+1}^{m}\left(x_{j}-x_{i}\right)} \\ &=-\sum_{i=1}^{m} \frac{\prod_{j=0}^{m}\left(x_{i}-y_{j}\right)}{\prod_{j=1, i \neq j}^{m}\left(x_{i}-x_{j}\right)} \end{aligned} μλsϵμhμ(s)sλhλ(s)=i=1msμ(i)hμ(i)(s)sλhλ(s)=i=1mj=1,j=imhμ(i)(Lj)j=0mhλ(Mj)=i=1mj=1i1(xixj)j=i+1m(xjxi)j=0i1(xiyj)j=im(yjxi)=i=1mj=1,i=jm(xixj)j=0m(xiyj)

注意到分母的 ∏ j ≠ i ( x i − x j ) \prod_{j\ne i}(x_i-x_j) j=i(xixj) 和有点像拉格朗日插值,引入变量 t t t ,看插出来的多项式有什么性质。设

KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ P(t)&=-\sum_{i…

那么 P P P m − 1 m-1 m1 次多项式,而要求的东西就是它的 m − 1 m-1 m1 次项系数。 Q Q Q m + 1 m+1 m+1 次多项式。注意到 ( P + Q ) ( x i ) = 0 (P+Q)(x_i)=0 (P+Q)(xi)=0 ,且 x i x_i xi 互不相同,所以还存在一个 α \alpha α ,使得

P ( t ) + Q ( t ) = ( t − α ) ∏ i = 1 m ( t − x i ) ⇒ P ( t ) = ( t − α ) ∏ i = 1 m ( t − x i ) − ∏ j = 0 m ( t − y j ) = ( − α − ∑ i = 1 m x i + ∑ i = 0 m y i ) t m + ( α ∑ i = 1 m x i + ∑ 1 ≤ i < j ≤ m x i x j − ∑ 0 ≤ i < j ≤ m y i y j ) t m − 1 + … \begin{aligned} P(t)+Q(t) &=(t-\alpha) \prod_{i=1}^{m}\left(t-x_{i}\right) \\ \Rightarrow P(t) &=(t-\alpha) \prod_{i=1}^{m}\left(t-x_{i}\right)-\prod_{j=0}^{m}\left(t-y_{j}\right) \\ &=\left(-\alpha-\sum_{i=1}^{m} x_{i}+\sum_{i=0}^{m} y_{i}\right) t^{m}+\left(\alpha \sum_{i=1}^{m} x_{i}+\sum_{1 \leq i<j \leq m} x_{i} x_{j}-\sum_{0 \leq i<j \leq m} y_{i} y_{j}\right) t^{m-1}+\ldots \end{aligned} P(t)+Q(t)P(t)=(tα)i=1m(txi)=(tα)i=1m(txi)j=0m(tyj)=(αi=1mxi+i=0myi)tm+(αi=1mxi+1i<jmxixj0i<jmyiyj)tm1+

而又因为 ∑ x i = ∑ y i \sum x_i=\sum y_i xi=yi ,且 [ t m ] P ( t ) = 0 [t^m]P(t)=0 [tm]P(t)=0 ,所以 α = 0 \alpha=0 α=0 。所以要求的即为

∑ 1 ≤ i < j ≤ m x i x j − ∑ 0 ≤ i < j ≤ m y i y j \sum_{1 \leq i<j \leq m} x_{i} x_{j}-\sum_{0 \leq i<j \leq m} y_{i} y_{j} 1i<jmxixj0i<jmyiyj

因为 x 0 = 0 x_0=0 x0=0 ,所以两个式子可以缩到一起。用平方消掉,然后再用一次 ∑ x i = ∑ y i \sum x_i=\sum y_i xi=yi ,就得到了

− 1 2 ∑ i = 0 m ( x i 2 − y i 2 ) -\frac{1}{2} \sum_{i=0}^{m}\left(x_{i}^{2}-y_{i}^{2}\right) 21i=0m(xi2yi2)

最后用 α i , β i \alpha_i,\beta_i αi,βi带入 x i , y i x_i,y_i xi,yi即可。

半标准杨表的计数

表内数 ≤ r \leq r r的杨表数。
f λ = ∏ r + j − i h λ ( i , j ) f_\lambda=\prod \frac{r+j-i}{h_{\lambda}(i,j)} fλ=hλ(i,j)r+ji
例题 Billboards

有一排长为 n n n的格子,大厨需要在里面放置一些物品,使得任意连续 m m m个格子中一定有 K K K个物品。大厨想要放的物品数尽量少,问有多少种方法,答案对 1 0 9 + 7 10^9+7 109+7 取模。
K ≤ m ≤ 50 , m ≤ n ≤ 1 0 9 K\leq m\leq 50,m\leq n\leq 10^9 Km50,mn109

显然的一点就是如果 n   m o d   m = 0 n\bmod m = 0 nmodm=0那么相当与是每隔 m m m个块里面就要放 k k k个,而且每个块这 k k k个中每一个的位置都单调不降。

记录每段放物品的位置,这样可以构成一个 n m \frac{n}{m} mn k k k列的半标准杨表,计数即可。

参考文献

OI-wiki 杨氏矩阵

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值