近幾日題目小記

西行寺無餘涅槃

題意

給定 \(n\) 個稀疏多項式,求他們的 \(\text{xor}\) 卷積。

具體的,每個多項式中有 \(k\) 個位置有數,值域爲 \([0,2^m)\) ,其中對於每個多項式的 \(k\) 個值從小到大排序後均爲 \(a_0,a_1,…,a_{k-1}\) ,在第 \(i\) 個多項式中,\(a_j\) 所在位置爲 \(p_{i,j}\)

\(m+k\leq 20,1\leq n\leq 10^6,k\leq 10\)

題解

暴力做法是對於每個多項式求完 \(FWT\)\(IFWT\) 回去,顯然這複雜度不可接受。

顯然點值的不同個數爲 \(2^k\) ,可以寫成 \(\pm a_1\pm a_2\pm a_3\pm…\pm a_k\)

不妨對於每個位置單獨考慮在 \(FWT\) 的結果,設 \(a_1+a_2+…+a_k\) 出現了 \(x_0\) 次,\(-a_1+a_2+…a_k\) 出現了 \(x_1\) 次,\(-a_0-a_1-…-a_k\) 出現了 \(x_{2^k-1}\) 次。

如果我們一直 \(x\) 的具體取值就很容易知道該位置 \(FWT\) 後的值。

顯然有

\[\sum_{i=0}^{2^k-1} x_i=n \]

考慮一個元素 \(\alpha\) 對答案的貢獻,具體的設多項式 \(F\) ,對於 \(i\in[1,n]\) ,在 \(p_{i,\alpha}\) 的位置加一,對 \(F\)\(FWT\) 的結果。

不妨令 \(\alpha=1\) ,那麼該多項式的當前考慮位置值爲 \(w\) ,則。

\[x_0-x_1+x_2-x_3+...=w \]

因爲 \(x_0,x_2,…\) 前面的係數爲 \(+1\) ,而 \(x_1,x_3,…\) 前面的係數爲 \(-1\)

同理可以得到 \(k\) 個方程,但這遠低於 \(2^k\)

人類智慧一下如果 \(\alpha\) 是個集合呢?

不妨設 \(\alpha=\{1,2\}\) ,那麼對於 \(i\in [1,n]\) ,在 \(p_{i,1}\bigoplus p_{i,2}\) 的位置加一,對 \(F\)\(FWT\) 的結果在當前考慮位置值爲 \(w\)

由於 \(a \bigcap(b \bigoplus c)=(a\bigcap b)\bigoplus (a \bigcap c)\) ,那麼表達的爲 \(a_1,a_2\) 前面係數相同的做 \(+1\) ,不同爲 \(-1\)

\[x_0-x_1-x_2+x_3+...=w \]

推廣一下就可以得到 \(2^k\) 個方程,但如何快速解呢?

事實上方程的係數是 \(F={x_0,x_1,x_2,…,x_{2^k-1}}\)\(FWT\) 後的結果,這也很好解釋。

那麼只要得到該 \(2^k\) 方程係數後做 \(IFWT\) 就可以得到 \(x_0,x_1,x_2,…,x_{2^k-1}\) 的具體值。

時間複雜度 \(\mathcal O(2^k(n+2^m\cdot m))\)

http://121.17.168.211:30000/contest/submission/9365

2021 山東省集 易見

題意

給定長度爲 \(n\) 的字符串 \(S\)\(Q\) 組詢問,每次詢問一段區間內本質不同的子序列個數。

\(1\leq n,q\leq 10^6\)

題解

弱化版題目:「2017 山東一輪集訓 Day6」子序列

本質不同子序列個數的求法可以通過建子序列自動機(模擬貪心)數 \(DAG\) 路徑條數解決,或者矩陣乘法。

對於矩陣乘法,設 \(f_{i,j}\) 表示開頭爲 \(i\) ,預支下一個接上來的字符爲 \(j\) 的方案數。

顯然對於字符 \(c\) 來講, \(f_{0,0}=f_{1,1}=f_{2,2}=…=1,f_{c,0}=f_{c,1}=f_{c,2}=…=f_{c,26}=1\) 設該矩陣爲 \(G(c)\)

那麼對於詢問區間爲 \([l,r]\) 來說,\(F=\prod_{i=l}^r G(S_i)\) 。 則最終答案爲 \(\sum_{i=0}^{25} F_{i,26}\)

故我們需要快速求一段區間內矩陣乘,可以維護前綴乘與前綴矩陣逆的乘。注意 \((AB)^{-1}=B^{-1}A^{-1}\)

具體的,設 \(P_i=\prod_{j=1}^i G(j),Q_i=\prod_{j=i}^1 G^{-1}(j)\) ,那麼答案寫成 \(Q_{l-1}\times P_r\)

時間複雜度 \(\mathcal O((n+q)|z|^3)\) ,僅能解決弱化版問題。https://loj.ac/s/1135303

觀察一下 \(G^{-1}(c)\) 的性質,該矩陣可以寫成

\[\begin{bmatrix}1& 0& 0 &0\\-1& 1& -1&-1\\0&0&1&0\\0&0&0&1\end{bmatrix} \]

假設 \(|z|=4,c=2\)

若矩陣 \(G^{-1}(c)\times F\) ,事實上是除第 \(c\) 行其餘行值不改變,而第 \(c\) 行每個值減去該列其他值。

觀察一下 \(G(c)\) 的性質,該矩陣可以寫成

\[\begin{bmatrix}1& 0& 0 &0\\1& 1& 1&1\\0&0&1&0\\0&0&0&1\end{bmatrix} \]

若矩陣 \(F\times G(c)\) ,事實上是將除第 \(c\) 列其餘值加上所在行的第 \(c\) 列值,第 \(c\) 列不變。

我們需要知道 \(Q_i\times P_j\) 最後一列的和,由於 \(P_j=\prod_{i=1}^j G(S_i)\) ,我們可以將 \(P_j\) 看成一個變換,將列看成整體,維護在 \(P_j\) 時是通過每列的多少係數構成的。

這很好通過 \(\mathcal O(n|z|)\) 的時間維護。

那麼我們需要知道 \(Q_i\) 的每列和,這也十分好維護,時間複雜度 \(\mathcal O(n|z|)\) .

故總時間複雜度 \(\mathcal O((n+q)|z|)\)

https://loj.ac/s/1135574

PKUWC2018 Minimax

題解

顯然有 \(\mathcal O(n^2)\) 樹形 \(dp\) 的做法,對其做線段樹合併維護乘法以及區間和可以做到 \(\mathcal O(n\log n)\)

https://loj.ac/s/1137898

PKUWC2018 隨機算法

題解

顯然有 \(\mathcal O(3^n)\) 的狀壓 \(dp\) ,但這樣記錄了每個點是否選擇與是否在獨立集中,很難得到優化。

考慮對於不在獨立集中的點,它出現的位置只要比相鄰第一個出現在獨立集時間靠後即爲合法。

那麼我們僅考慮在獨立集的元素爲 \(S\) ,設 \(f_S\) 表示獨立集爲 \(S\) ,並且考慮完 \(Nex(S)\) 的方案數。其中 \(Nex(S)\)\(S\)\(S\) 的鄰居集合。

考慮在 \(f(S)\) 後面加入元素 \(u\) ,顯然需要滿足 \(S\) 不存在到 \(u\) 的邊,但轉移到 \(f(S+u)\) 的係數是什麼呢 。

設需要考慮點的個數爲 \(x\) ,後面還有 \(y\) 個點沒有確定位置,那麼通過插板法可以得到 \(\binom{x+y}{y-1}\)

時間複雜度 \(\mathcal O(2^n\times n)\)

https://loj.ac/s/1138039

PKUWC2018 獵人殺

題解

啥都不會/qaq。

一個很精妙的轉化是每次 \(\dfrac{w_i}{\sum w}\) 的概率選擇 \(i\) ,但若已經選擇則再重新選擇,使得最後均被選擇,概率是相同的。

對答案容斥,記 \(f(S)\) 表示在 \(1\) 號點選擇前至少 \(S\) 未被選擇,則

\[\begin{aligned} Ans&=\sum_S (-1)^{|S|} f(S)\\&=\sum_S (-1)^{|S|}\dfrac{1}{1-{\dfrac{\sum w-w_1-\sum_{u\in S w_u}}{\sum w}}}\times \dfrac{w_1}{\sum w}\\&=w_1\sum_{S} (-1)^{|S|} \dfrac{1}{w_1+\sum_{u\in S} w_u} \end{aligned} \]

由於 \(\sum w\leq 10^5\) ,考慮枚舉 \(\sum_{u\in S} w_u\) ,那麼需要知道 \(\sum (-1)^{|S|}\)

答案可以寫成 \([x^i]\prod_{i=2}^n (1-x^{w_i})\) ,分治 \(NTT\) 即可。時間複雜度 \(\mathcal O(\sum w\log^2 \sum w)\)

https://loj.ac/s/1138127

PKUWC2018 隨機遊走

題解

對答案 \(Min-Max\) 容斥,那麼需要對每個子集 \(T\) 求出從 \(x\) 走到 \(T\) 中點停止的期望時間。

普通消元是 \(\mathcal O(n^3)\) 無法解決問題,不妨將轉移寫出,設 \(f_u\) 表示從 \(u\) 開始走到 \(T\) 中任意一點停止的期望時間,則

\[u\in T,f_u=0\\ u\notin T,f_u=\dfrac{1}{d_u}(\sum_{v} f_v+f_{fa_u})+1 \]

樹上高斯消元很經典的套路是每個點 \(f_u\) 可以寫成

\[f_u=A_uf_{fa_u}+B_u \]

其中,\(A_u,B_u\) 爲常數。

證明也較爲 \(\text{trival}\) ,若 \(u\) 爲葉子那麼 \(f_u=\frac{1}{d_u}f_{fa_u}+1\)\(A_u=\frac{1}{d_u},B_u=1\) 。否則

\[\begin{aligned} f_u&=\dfrac{1}{d_u}(\sum A_vf_u+B_v+f_{fa_u})+1\\ d_u\cdot f_u&=\sum A_vf_u+B_v+d_u+f_{fa_u}\\ (d_u-\sum A_v) f_u&=f_{fa_v}+\sum B_v+d_u \end{aligned} \]

\(A_u=\dfrac{1}{d_u-\sum A_v},B_u=\dfrac{\sum B_v+d_u}{d_u-\sum A_v}\)

由於不能 \(\mathcal O(q2^n)\) ,需要 \(FWT\) 處理出答案,\(O(1)\) 回答。

時間複雜度 \(\mathcal O(2^nn+q)\)

https://loj.ac/s/1138084

PKUSC2018 最大前綴和

題解

對於 \(a\) 中僅存在一個負數的情況考慮枚舉集合 \(S\) 使得 \(S\) 爲最大前綴和,那麼 \(S\) 的補集 \(T\) 需要滿足 \(T\) 中前綴和均小於 \(0\)

這也是該題的解題思路。

\(f_S\) 表示 \(S\) 中的元素任意排列後最大前綴和爲它本身的方案數,\(g_S\) 表示 \(S\) 中的元素任意排列後前綴和 \(<0\) 的方案數。

\(g_S\) 很好轉移,每次往後新添一個元素看一下前綴和是否 \(<0\) ,時間複雜度 \(\mathcal O(2^nn)\)

對於 \(f_S\) 來說往後新添一個字符很難進行轉移,但往前填就會方便轉移。

具體的,設當前序列 \({a_1,a_2,…,a_k}\) ,由於 \(\sum_{i=1}^k a_i\) 爲最大值那麼 對於 \([2,k]\) 來說前綴最大值也應該爲他本身,否則一定不優,並且 \(\sum_{i=2}^k a_i\geq 0\) ,否則僅選 \(a_1\) 即可。

那麼我們只需要枚舉第一個元素 \(u\) ,若 \(Sum(S)\geq 0\) ,則 \(f_{S+u}\leftarrow f_{S}\)

時間複雜度 \(\mathcal O(2^nn)\)

https://loj.ac/s/1138359

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章