1. 程式人生 > 其它 >清華集訓2016~2017選做

清華集訓2016~2017選做

啥都不會.jpg

Alice和Bob又在玩遊戲

先考慮暴力怎麼做,列舉每個節點做根節點,然後求其子樹內 \(SG\) 值,也就是列舉每一個節點,然後求剩餘子樹 \(SG\) 值的異或和。最後求 \(mex\) 即可。

考慮優化,每一次合併兩個子樹,每個子樹用一個 \(01-Trie\) 表示所刪去每一個點的答案,然後新加一個子樹相當於給這個子樹所有的答案異或上合併上來的那棵樹的異或和,合併上來的樹同理,然後在用 \(Trie\) 合併將兩棵子樹合併。這些操作都可以簡單的採用 \(Trie\) 樹完成。

如何優雅地求和

\(f(x)\) 求出來,一次考慮每一個係數,於是問題轉化為求

\[\sum_{i=0}^mf_i\sum_{k=0}^nk^i\dbinom{n}{k}x^k(1-x)^{n-k} \]

\(k^i\)

不太對勁,將其拆開,表示成:\(k^i=\sum_{j=0}^k\begin{Bmatrix}i\\j\end{Bmatrix}k^{\underline{j}}\),帶入可得,原式等於:

\[\begin{aligned} &\sum_{i=0}^mf_i\sum_{k=0}^n\sum_{j=0}^k\begin{Bmatrix}i\\j\end{Bmatrix}k^{\underline{j}}\dbinom{n}{k}x^k(1-x)^{n-k}\\=&\sum_{i=0}^mf_i\sum_{j=0}^n\begin{Bmatrix}i\\j\end{Bmatrix}\sum_{k=j}^n\dfrac{k!}{(k-j)!}\dfrac{n!}{k!(n-k)!}x^k(1-x)^{n-k}\\=&n!\sum_{i=0}^mf_i\sum_{j=0}^n\begin{Bmatrix}i\\j\end{Bmatrix}\sum_{k=j}^n\dfrac{1}{(k-j)!(n-k)!}x^k(1-x)^{n-k}\\=&n!\sum_{i=0}^mf_i\sum_{j=0}^n\begin{Bmatrix}i\\j\end{Bmatrix}\dfrac{1}{(n-j)!}\sum_{k=j}^n\dbinom{n-j}{n-k}x^k(1-x)^{n-k}\\=&n!\sum_{i=0}^mf_i\sum_{j=0}^n\begin{Bmatrix}i\\j\end{Bmatrix}\dfrac{x^j}{(n-j)!} \end{aligned}\]

直接遞推斯特林數求和即可。其實可以通過下降冪求和做到 \(O(NlogN)\)

,但是懶得打 \(Latex\)

石家莊的工人階級隊伍比較堅強

考慮我們需要一個操作,來表示獲勝,平局和失敗的共同點,由於將獲勝反過來就是失敗,所以肯定不能採用滿足交換律的操作,發現三進位制不退位減法就可以很好地表示輸贏,具體的,如果 \(a-b=1\)\(a\) 獲勝,\(a-b=2\)\(b\) 獲勝,\(a-b=0\) 則平局。設 \(F_i(x)\) 表示 \(x\) 三進位制下 \(i\) 位的數量,於是我們每一輪操作就是:

\[f_{i, j}=\sum_{k}f_{i-1, k}, b_{F_1(j-k), F_2(j-k)}=\sum_{k+l=j}f_{i-1, k, B_l} \]

其中 \('+'\)

表示不進位加法,\(B_l=b_{F_1(l), F_2(l)}\)。這裡就已經可以看出是一個三進位制 \(FWT\) 了,三進位制 \(FWT\) 構造的矩陣就是範得蒙得矩陣,考慮怎麼計算 \(w_3^1\),根據單位復根的性質,有 \(1+w_3^1+w_3^2=0\)。於是可以解出 \(w=\dfrac{-1+\sqrt{-3}}{2}\)。設 \(y^2=-3\),那麼給每個數賦值為 \(ay+b\),然後採用這種二維操作即可。

溫暖會指引我們前行

字典序最大,等價於求最大生成樹,直接用 \(LCT\) 維護即可。

組合數問題

考慮 \(k\) 很小,採用 \(Lucas\) 定理,將所有組合數拆分成 \(k\) 進位制的形式。\(\dbinom{i}{j}\)\(k\) 的倍數等價於 \(i\)\(k\) 進位制拆分之後,存在一位比 \(j\)\(k\) 進位制拆分小。

數位 \(DP\),設 \(dp[i][0/1][0/1][0/1]\) 表示考慮到 \(k\) 進位制的第 \(i\) 位,第一個數是否有最高位限制,第二個數是否有最高位限制,前 \(i\) 位是否存在一位 \(i\)\(j\) 小,直接轉移即可。

汽水

給每條邊權值減去 \(k\),問題等價於平均邊權儘可能接近 \(0\)。採用分數規劃,對大於 \(0\) 小於 \(0\) 分別做一遍,每次相當於求最長路徑,可以採用點分治,然後跑雙指標判斷是否存在對應的路徑。

生成樹計數

考慮貢獻只和度數相關,那麼考慮 \(prufer\) 序列。假設 \(prufer\) 序列為 \(\{c_i\}\),那麼答案可以寫成:

\[\sum_{\sum c_i=n-2}\Big(\prod a_i^{c_i+1}\Big)\dfrac{(n-2)!}{\prod c_i!}\Big(\prod (c_i+1)^m\Big)\Big(\sum(c_i+1)^m\Big) \]

後面的 \(\sum\) 看起來很不友好,將其拆開,可以得到:

\[(n-2)!\Big(\prod a_i\Big)\sum_{\sum c_i=n-2}\sum_{k}\dfrac{\prod a_i^{c_i}}{\prod c_i!}\Big((c_k+1)^{2m}\prod_{j\ne k} (c_j+1)^m\Big) \]\[(n-2)!\Big(\prod a_i\Big)\sum_{\sum c_i=n-2}\sum_{k}\Bigg(\dfrac{a_k^{c_k}(c_k+1)^{2m}}{c_k!}\Bigg)\prod_{j\ne k} \Bigg(\dfrac{a_j^{c_j}(c_j+1)^m}{c_j!}\Bigg) \]

\(F(x) = \sum_i\dfrac{(i+1)^{2m}x^i}{i!}, G(x)=\sum_{i}\dfrac{(i+1)^{m}x^i}{i!}, S(x)=\prod G(a_i\ x)\),那麼答案可以寫成:

\[(n-2)!\Big(\prod a_i\Big)[x^{n-2}]S(x)\sum_{k}\dfrac{F(a_k\ x)}{G(a_k\ x)} \]

考慮 \(S(x) = \exp\big(\sum\ln G(a_i\ x)\big)\),那麼我們求出 \(\ln G(x)\)\(\dfrac{F(x)}{G(x)}\)。只需要對 \(k=0\sim n - 2\) 求出 \(\sum a_i^k\) 即可。

這是一個經典問題,設 \(A(x) = \sum a^kx^k=\dfrac{1}{1-ax}\),那麼我們需要求的式子即為 \(\sum \dfrac{1}{1-a_ix}\),直接分治 \(NTT\) 通分即可求出答案。

無限之環

對於網格圖,先將其二分圖染色,把每個方格拆分成四個點,分別表示上下左右。由於直線型不能旋轉,其餘形狀每次旋轉只有一個點會發生變化,將會發生變化的那兩個點連邊,邊權為需要轉的次數,最後圖不存在漏水當且僅當每一個黑白出口都進行了配對。

一條增廣路的意義是從白點出發匹配一個黑點,對這張圖跑最小費用最大流即可,如果滿流則說明合法。

小 Y 和二叉樹

先找到最小的度數小於 \(2\) 的節點,將其當作根節點,然後這個節點的兒子所連線的兩棵子樹為變成兩個獨立的子問題。比較兩個子樹中,葉子深度最小的那個,逐個確定每一位。那麼只需要求出每個子樹內葉子節點的最小值即可。

小 Y 和恐怖的奴隸主

\(dp[i][j][k][l]\) 表示考慮到第 \(i\) 天,有 \(j\) 個一滴血的, \(k\) 個兩滴血的,\(l\) 個三滴血的,然後用矩陣轉移即可,注意這裡狀態總量是 \(166\) 個,需要用向量乘矩陣的套路。

榕樹之心

考慮 \(u=1\) 怎麼判斷,子樹內的元素可以相互抵消,那麼設 \(f_i\) 表示考慮到 \(i\) 點的子樹內,抵消之後最少剩下多少次操作(顯然最大是子樹大小,範圍內所有奇偶性相同的都可以達到)直接分類轉移即可。

考慮 \(u\ne 1\) 的情況,此時把 \(1\sim u\) 想象成一個新的根節點(也就是縮在一起),最開始先把心移動到 \(u\) 點,做剛剛的 \(dp\) 即可。直接做是 \(O(N^2)\) 的,發現對答案有影響的只有重兒子,對每個點維護一個重兒子和次重兒子即可。

某位歌姬的故事

一段區間的最大值為 \(x\),等價於一段區間所有數都不超過 \(x\),且存在一個數等於 \(x\)。只有第一個限制很好處理,對於第二個限制可以考慮容斥。

先將值域離散化,對於每個區間儲存區間長度 \(l\) 以及區間內的數不能超過 \(x\)\(x\) 小的區間不會對 \(x\) 大的區間產生影響,那麼我們從小到大處理每一種 \(x\),然後將其刪去,最後將所有的方案乘起來即可。

對於區間內數不超過 \(x\) 的區間,問題可以等價於,有一個長度為 \(n\) 的序列,每一段區間至少放入一個黑球,其餘部分放入白球,一種方案的貢獻是 \((x-1)\) 的白球個數次方。

於是設 \(f_{i, j}\) 表示考慮到 \(i\),上一次放入 \(x\) 是在節點 \(j\),每次列舉當前位置放不放黑點,然後字首和優化轉移即可。