定義跳過。
3 楊表和排列的對應關係
插入算法: \(S\gets x\) 表示把 \(x\) 從第一行插入 \(S\) 中,每次找到該行的 upper_bound
,用 \(x\) 替換,然後往下插入。如果找不到就直接插在末尾。
\(x\to S\) 表示從第一列插入,方法類似。
刪除算法:刪掉位置 \((i,j)\) ,把從行插入算法倒過來做。
對於一個排列 \(X\) ,可以同時維護兩個表 \(P_X,Q_X\) ,初始都爲空。按順序執行 \(P_X\gets x_i\) ,並把插入時加的那個格子在 \(Q_X\) 中的對應位置賦爲 \(i\) 。那麼最後 \(P_X,Q_X\) 都是楊表。
由於插入算法和刪除算法互爲逆操作,所以從一對形狀相同的 \(P,Q\) 出發也可以造出一個排列,所以一一對應。
4 楊表和對稱矩陣
一個矩陣 \(A\) 可以對應到一些數對 \((i,j)\) ,其中 \((i,j)\) 出現了 \(A_{i,j}\) 次。把這些數對排序,可以得到一些 \((u_i,v_i)\) 。
然後按順序往 \(P\) 中插入 \(v_i\) ,並在 \(Q\) 中記錄 \(u_i\) ,可以得到一對半標準楊表。可以發現一對形狀相同的半標準楊表也同樣可以對應回一組 \((u,v)\) (在 \(Q\) 中找到最大值所在的那一堆格子,找到在 \(P\) 中對應的最大值的格子(若仍有多個,一定是在同一行,就找最右邊的那個),把它刪掉)。
現在考慮 \(P,Q\) 裏面具體存了什麼。先考慮第一行。
也就是每次找到所有 \(v\) 的(嚴格)前綴最小值作爲 \(A_X^{(1)}\) ,然後刪掉並重復。可以發現 \(A_X^{(1)}\) 就是曾經在 \(P_X^{(1,1)}\) 出現過的所有數。 \(P\) 的第一行是取每個 \(A_X^{(i)}\) 中的最小的,而 \(Q\) 的第一行是取最大的。注意這裏只說了第一行而沒說下面。
不是很想看證明……
簡單感性證明一下 \(u,v\) 是排列時爲什麼第一行是對的:此時 \(P\) 的第一行存的是滿足“以它結尾的 LIS 長度爲 \(i\) ”的最小的 \(v\) ,而 \(Q\) 的第一行存的是“到哪裏時第一次得到長度爲 \(i\) 的 LIS ”。把 \((u,v)\) 取反得到 \((u,v^{-1})\) (注意 \(u_i=i\) ),而 \(v\) 的一個 LIS 也可以對應到 \(v^{-1}\) 的一個 LIS ,所以大概就是對的了。
其他的用某種方法證明,不想看了。
剩下的也不想看了,我賭它不考。
5 楊表與最長上升子序列
定理: \(P_X\) 的第一行長度即爲排列 \(X\) 的 LIS 長度。顯然。
引理: \((x\to S)\gets y=x\to (S\gets y)\) 。你說是就是吧。
定理:對於排列 \(X\) 和楊表 \(P_X\) ,如果翻轉 \(X\) 得到 \(X^R\) ,那麼 \(P_{X^R}\) 即爲 \(P\) 翻轉行列得到。
證明:歸納法,用上面那個引理來交換插入順序。
這個定理可以引出一些別的東西。比如由於 LIS 翻轉之後就得到 LDS ,所以下文的 \(\text{k-LIS}\) 序列翻轉就會得到 \(\text{k-LDS}\) 。把一整個排列翻轉之後, \(P\) 也翻轉了行列,所以這也說明了 \(\text{k-LDS}\) 就是前 \(k\) 行的長度加起來。
另外,如果令 \(x_i:=n-x_i+1\) ,即翻轉了小於號的定義,那麼 \(\text{k-LIS}\) 和 \(\text{k-LDS}\) 也互相交換,所以楊表的形態也會翻轉行列。但是裏面填的值會發生奇妙的變化。
定理: \(P_X\) 的第一列長度是 \(X\) 的 LDS 長度。
5.1 最長的 \(\text{k-LIS}\) 子序列
定義 \(\text{k-LIS}\) 子序列爲 LIS 長度不超過 \(k\) 的序列,同理定義 \(\text{k-LDS}\) 。然後就突然發現前 \(k\) 列的長度總和就是最長的 \(\text{k-LIS}\) 長度。
引理:對於序列中三個連續的數 \(x, y,z\,(x < y < z)\),如果它們在序列中不是按照 \((x, y,z)(z, y, x)\) 出現的話,交換 \(x,z\) 後序列的最長 \(\text{k-LIS}\) 子序列長度不變。
證明:
只考慮 \((z,x,y)\to (x,z,y)\) ,另外三種情況他說是類似的那就類似吧。
顯然交換之後答案不會變大,只需要證明答案不會變小。考慮現在的最長序列 \(G\) ,如果不同時包含 \(z,x\) 那就沒啥事,如果同時包含 \(z,x,y\) 那也沒啥事,只有在 \(G\) 包含 \(z,x\) ,不包含 \(y\) ,且
swap(z,x)
之後獲得了同時包含 \(x,z\) 的長度爲 \(k+1\) 的 LIS ,的時候,纔會出事。此時直接往 \(G\) 中加入 \(y\) ,刪去 \(x\) ,有可能出現包含 \(y\) 的長度爲 \(k+1\) 的 LIS 嗎?
圖中出現了 \((b)-x-(k-a)\) 和 \((a)-z-(k-b-1)\) ,一定有一個大於 \(k\) ,所以 \(G\) 不合法,矛盾。
所以就得到了不包含 \(x\) 的 \(G'\) ,所以答案不會變小。
引理:對於排列 \(X\) 和它產生的楊表 \(P\) ,重組一個排列 \(X^*=(P_{m,1},\cdots,P_{m,\lambda_m},P_{m-1,1},\cdots,P_{1,\lambda_1})\) ,那麼 \(X\) 可以通過上面那個引理的交換操作轉化成 \(X^*\) 。
歸納法,每插入一個就在當前的排列裏模擬一遍。
現在每一段最多選 \(\min(k,\lambda_i)\) 個,所以直接選前 \(k\) 列就頂到了上界,並且合法。
CTST2017 最長上升子序列
相當於是要維護每一個前綴的楊表,求出前 \(k\) 列的長度之和。
暴力做插入操作是 \(O(n^2\log n)\) 爆了。
注意到 \(k>\sqrt n\) 時每一列的長度不會超過 \(\sqrt n\) ,所以可以只維護前 \(\sqrt n\) 行和前 \(\sqrt n\) 列。
維護行很容易,怎麼維護列呢?由於我們只關心形態,所以可以簡單地把小於號變成大於號另外維護一個楊表,那麼前 \(\sqrt n\) 行其實就是真正的前 \(\sqrt n\) 列。
5.2 LIS 計數
如果只關心一些 \(\text{LIS,LDS}\) 長度的信息,那麼就直接枚舉楊表形態即可,複雜度大約是 \(p(n)\) 。
至於怎麼數一個形態的楊表有多少個,見下文。
6 楊表與鉤子公式
設 \(\lambda=(\lambda_{1},\cdots,\lambda_m)\) 爲 \(n\) 的一個整數拆分,設 \(h_{\lambda}(i,j)\) 表示 \((i,j)\) 正右邊和正下方的格子數量。
先直接給出公式:
或者如果只用 \(\lambda\) 表達,那就是
下面這個式子爲什麼和上面相等呢? \(\prod_{i=1}^{m}\left(\lambda_{i}+m-i\right) !\) 這一部分是假裝楊表是一個完整的長方形,所以每一列的貢獻應當是 \({\left(\lambda_{i}+m-i\right) !}\over (m-i)!\) ;而上面則是把有缺口的位置的貢獻除掉,並把多餘的 \((m-i)!\) 除掉。
6.1 鉤子公式的一個證明
採用歸納法。設 \(\lambda\) 是 \(n\) 的一個整數拆分,那麼以它爲形態的楊表中必須找到一個邊角格子放 \(n\) ,而把這個 \(n\) 刪去就會得到 \(n-1\) 的整數拆分 \(\mu\) 。記 \(\mu\to \lambda\) 當且僅當形狀爲 \(\lambda\) 的楊圖包含形狀爲 \(\mu\) 的楊圖,那麼就要證明
先來冷靜分析一下,刪去一個邊角格子會對 \(h\) 帶來什麼影響。顯然不同行也不同列的 \(h\) 完全沒有變化;在同一行中,它們的 \(h\) 全部減一,但是原來的 \(h\) 可能被分成了若干個連續段,每一段只有開頭結尾沒被抵消,所以只會在邊角格子附近有變化。
設 \(c=(i,j),ct(c)=i-j\) 。下面是一個例子。
click to open
把 \(\lambda\) 的所有邊角拿出來,設從上往下分別是 \(X_i=(\alpha_i,\beta_i)\,(1\le i\le m)\) 。令 \(Y_i=(\alpha_i,\beta_{i+1})\,(0\le i\le m)\) ,且 \(\alpha_0=\beta_{m+1}=\beta_0=0,X_0=(0,0)\) 。再設 \(A(c),B(c)\) 爲 \(c\) 往下和往右走到最遠的點,那麼 \(h_{\lambda}(c)=ct(A(c))-ct(B(c))+1\) 。
下面是一個例子。
click to open
令 \(x_i=ct(X_i),y_i=ct(Y_i)\) ,那麼顯然有 \(\sum_{i=0}^m x_i=\sum_{i=0}^m y_i\) 。
接下來的證明分爲三個步驟:
第一步
設 \(\mu^{(i)}\) 加上 \(X_i\) 得到 \(\lambda\) ,那麼只有和 \(X_i\) 同行同列,且在邊角格子旁邊的格子纔會有影響。對於同列的格子,設 \(L_j=(\alpha_j,\beta_i)\,(1\le j<i),M_j=(\alpha_j+1,\beta_i)\,(1\le j<i)\) ,那麼只有它們纔有貢獻。有
同行的格子同理,懶得抄了。
所以
第二步
注意到分母的 \(\prod_{j\ne i}(x_i-x_j)\) 和拉格朗日插值有點神似,所以引入變量 \(t\) ,看插出來的多項式有什麼性質。設
那麼 \(P\) 是 \(m-1\) 次多項式,而要求的東西就是它的 \(m-1\) 次項係數。 \(Q\) 是 \(m+1\) 次多項式。注意到 \((P+Q)(x_i)=0\) ,且 \(x_i\) 互不相同,所以還存在一個 \(\alpha\) ,使得
而又因爲 \(\sum x_i=\sum y_i\) ,且 \([t^m]P(t)=0\) ,所以 \(\alpha=0\) 。所以要求的即爲
因爲 \(x_0=0\) ,所以兩個式子可以縮到一起。然後有兩個變量 \(i,j\) 很不爽,用平方消掉。然後再用一次 \(\sum x_i=\sum y_i\) ,就得到了
第三步
考慮 \(x,y\) 具體是什麼,直接帶進去,化簡,就可以得到 \(n\) 。
6.2 在楊圖上的隨機遊走
背不下來,希望不考。
7 楊表與網格圖路徑
網格圖路徑就是從一個整點走到另一個整點,每一步都往上或往右,的路徑。
7.2 非交叉網格路徑
我對 LGV 引理的理解(謝謝 EI 太陽):
考慮任意一組從起點到終點(順序任意)的路徑,如果它們有交點,那麼可以找到整張圖中的第一個交點(小於號隨便定義一下),然後把交於這裏的路徑的起點任意排列,那麼奇排列和偶排列的個數恰好相等。
所以可以枚舉任意排列之後的起點終點對應關係(也就是枚舉一個排列),算出方案數,並根據奇偶性決定是否乘 -1 。這就是行列式的定義式。
於是所有有交的路徑組合都被幹掉了,而剩下的組合則乘上了 \(\text{sgn}(\sigma)\) 。由於起點終點的座標大小關係,只有 \(\sigma=(1,2,\cdots,n)\) 的時候纔有可能不交,所以就得到了答案。
然後是兩個簡單的一一對應關係:
半標準楊表 $\leftrightarrow $ \(\{(-i,1)\},\{(\lambda_i-i,n)\}\) 的不相交路徑:
半標準斜楊表 \(\leftrightarrow\) \(\{(\mu_i-i,1)\},\{(\lambda_i-i,n)\}\) 的不相交路徑:
7.3 行列式公式
由於上面兩個對應關係,可以得到對(半)標準(斜)楊表的計數方法。半標準(斜)楊表可以直接對應到一組路徑,所以計數方法顯然;標準楊表已經有鉤子公式;標準斜楊表則是在路徑的基礎上要求每個縱座標只有一條路徑往右走,但是這與 LGV 引理的容斥方式並不矛盾,所以可以得到
例(歐拉數):求長爲 \(2n\) 的排列中,滿足 \(a_{1}<a_{2}>a_{3}<\cdots>a_{2 n-1}<a_{2 n}\) 的個數。
直接造一個對應的斜楊表即可: \((2 n-1+2,2 n-2+2, \ldots, n+2) /(2 n-1,2 n-2, \ldots, n)\) 。
用這個思路可以去做一些其他關於大小關係的計數問題。
後面還有一些詭異的計數公式,暫時不看了。
半標準楊表的計數公式:設 \(n\) 爲值域,那麼個數是
或是
注意是枚舉到 \(n\) 。 \(i>|\lambda|\) 時 \(\lambda_i=0\) 。