P1155 [NOIP2008 提高組] 雙棧排序
數學限制與二分圖的轉化
先保證合法,再考慮構造,減少討論
如果存在 \(j<i<k\land a_i<a_j<a_k\),則 \(i,j\) 不能放在一個棧中,連邊 \((i,j)\),輸入合法當且僅當構成二分圖。
接著構造方案,每次插入前先看字典序比其小的彈出操作能否進行即可。
P9870 [NOIP2023] 雙序列擴充
dp與網格路徑的轉化
考慮最值
將DP轉移的過程看作網格圖的一條轉移路徑,在這上面找到特殊性質,分治解決。
2024.10.2T4 逆序圖
特殊生成的圖與序列的轉化
元素積之和等於元素和之積
觀察整個生成的過程,不難看出一個連續快一定是序列的一段,於是這就變成了一個序列計數問題。
可以考慮套路的列舉最後個連續段 \(j+1\sim i\),因為 \(1\sim j\) 的所有元素都小於 \(j+1\sim i\),前面就是兩個完全獨立的子問題。設答案為 \(f_n\),則:
\(g_i\) 表示大小為 \(i\) 的聯通段方案權值之和, \(h_{i}\) 表示大小為 \(i\) 的聯通段個數。
這三部分分別表示:這一個選並且前面選了,這一個不選並且前面選了,這一個選了並且前面不選。
考慮如何求解 \(g,h\)。
\(h\) 的求法十分套路,求聯通圖的個數等於總個數-不連通的個數。不連通說明可以劃分為多個連通塊,於是列舉第一個連通塊。 \(h_{i}=i!-\sum_jh_j(i-j)!\)
\(g\) 的求法也類似,以總方案數減去不合法的方案數,\(g_i=sval_i-\sum_j(f_jsval_{i-j}-g_{j}(i-j)!)\),計算原因:一段權值,算重的既有前面的,又有後面的,\(f_i\) 為後面權值算重次數,\(sval_{i-j}\) 為算重的權值,\(g_i\) 為前面算重的權值,\((i-j)!\) 為算重的次數。\(sval_i\) 為不顧連通性的方案和(所有可能的選取方案和)。
接下來考慮如何計算 \(sval_i\),簡單的為所有的權值 \(\times\)出現的個數。
轉移為 \(sval_i=\sum_jF_j\times(i-j)\times {2\choose i}\times (i-2)!\),\(i-j\) 為權值選擇方案,\({2\choose i}\) 為數列位置選擇方案,\((i-2)!\) 為剩下位置隨便選。
複雜度 \(\mathcal O(n^2)\)。聽說可以用 FFT 最佳化到 \(\mathcal O(n\log n)\)。