反射容斥
一類關於格路計數的容斥手法。
考慮一種卡特蘭數通項公式的組後證明。
一種卡特蘭數的等價描述是從 \((0,0)\) 走到 \((n,n)\) 的路徑數,每次只能走簡單格路(每一維的變化量的絕對值的和為 \(1\)),不能經過 \(y=x+1\) 這條直線的路徑方案數。
首先如果沒有不經過直線的限制的方案數為 \(\binom{2n}{n}\),現在考慮如果不滿足限制會發生什麼。
對於一個經過 \(y=x+1\) 的路徑,找到路徑與直線的第一個交點 \(A\),將之前的路徑沿著 \(y=x+1\) 翻折,那麼一定走到一個路徑重點為 \(T’(n-1,n+1)\) 的方案數。
注意到每一條到 \(T’(n-1,n+1)\) 的路徑,一定都會經過 \(y=x+1\) 且與一條經過這條直線到 \(T(n,n)\) 的路徑一一對應。
所以有公式:\(Catlan(n)=\binom{2n}{n}-\binom{2n}{n+1}\)
運用這個方法可以很好的運用到計數到達 \(T(n,m)\)(保證 \(n \ge m\)) 且不經過 \(y=x+1\) 的直線的方案數。
方案數為:\(f(n,m)=\binom{n+m}{n}-\binom{n+m}{n+1}\),證明與上面類似。
賀一張圖方便理解:
再推廣一波,從 \((0,0)\) 到 \((n,m)\) 不經過直線 \(y=x+b\) 的方案數為:\(\binom{n+m}{n}-\binom{n+m}{n+b}\)。
繼續思考:求從 \((0,0)\) 到 \((n,m)\) 不經過直線 \(y=x+l\) 且 \(y=x+r\) 的方案數 \((l<0<r)\)
先想:反射容斥能解決的是:可以找到路徑第一次和某條直線的交點,然後翻折過去。
定義由 \(L,R\) 構成的字串例如 \(RLR\) 表示依次先與 \(y=x+r\) 相交再和 \(y=x+l\) 相交再和 \(y=x+r\) 相交。(如果連續多次與一條直線相交只記錄一次)
順次處理字串中的字元,然後前面的部分關於字元對應的直線翻折,假設最後起點為 \(x,y\),答案為 \(\binom{n+m}{n}-\binom{n-x+m-y}{n-x}\)。使用反射容斥可以計算的是所有包含當前串為子序列的字串所代表的路徑總數。(畫圖方便理解)
要求的答案為字串為空集。
設 \(f(S)\) 表示處理 \(S\) 串得到的答案。使用容斥可得到。
證明:一個串 \(LRLRL\cdots\) (\(R\) 開頭同理),空集有 \(1\) 的貢獻。能成為子序列的有 \(S\) 的字首以及 \(S\) 去掉第一位的所有字首,那麼剛好會做 \(-1\) 的貢獻,第一個串的貢獻是 \(-1,1,-1,1\cdots\)(第一位開始),第二個串的貢獻是 \(1,-1,1\cdots\)(第二位開始),兩柿相加和恰好為 \(-1\),再加上空集的貢獻恰好為 \(0\)。所以只有當 \(S\) 為空集才會貢獻。
化簡可得:
注意:\(k\) 可以取到所有整數,但是有值的位置只有 \(O(\dfrac{n}{r-l})\) 個。
https://uoj.ac/problem/424
題目要求統計長度為 \(n\),值域在 \([1,m]\) 且每種值至少出現一次的不同構的笛卡爾樹個數。(如果有多個最大值取編號最小的)
首先 \(n>m\) 必然無解。
那麼對於每個點,左兒子的取值要嚴格小於它,右兒子的取值小於等於它。
形式化定義向左的鏈長:設 \(f(rt)\) 為括號序列, \(f(rt)=(f(lson))+f(rson)\)
向左鏈長即為 \(f(rt)\) 的最大巢狀層數。
觀察到向左鏈長只要小於等於 \(m\) 為笛卡爾樹合法的充要條件。
必要性:如果向左鏈長大於了 \(m\),那麼至少有 \(m+1\) 個不同的數,不合法。
充分性:考慮對每個節點分配合法的值域範圍 \([1,x]\),當前節點直接取 \(x\),左兒子分配 \([1,x-1]\),右兒子分配 \([1,x]\) 即可。
注意到一個括號序列恰好對應一棵二叉樹,轉為對括號序列的計數。
講左括號看成 \(1\),右括號看成 \(-1\),轉化為計數從 \((0,0)\) 走到 \((2n,0)\),每次只能向右上/右下走,且不能經過 \(y=-1\) 和 \(y=m+1\) 的路徑方案數。
發現這與我們介紹的雙邊界反射容斥不大相同。
考慮一種常見的手法,透過對座標軸的旋轉/對稱/平移將已知推未知。
將座標軸旋轉 45 度,變為計數從 \((0,0)\) 走到 \((n,n)\),每次只能向左或者向上走,且不經過 \(y=x+1\) 和 \(y=x-m-1\) 的方案數。
套用公式可得:
考拉聲稱可以使用多項式平移|連續點值平移做到根號,具體的帶學習。(待補)
P3266 JLOI2015] 騙我呢
首先注意到每行 \(m\) 個數且互不相同,一共有 \(m+1\) 個數,那麼中間只會有一個數沒被用。
設 \(f_{i,j}\) 表示第 \(i\) 行不用值 \(j\) 的方案數。又因為 \(x_{i,j}<x_{i-1,j+1}\)。
每個點是由它右下角的點以及左側的點轉移而來,這並不符合我們的需求。
考慮將底 \(i\) 行的所有點集體向右平移 \(i\) 個為位置。那麼有:
這是我們所會的,即從 \((0,0)\) 走到 \((n+m+1,n)\) 不經過 \(y=x+1\) 和 \(y=x-m-2\) 的方案數,帶入柿子即可。(我知道你想要最終的柿子)