「NOI 2021」題解


代碼托管到第三方平台上。

NOI2021 題解

D1T1 輕重邊

水題

D1T2 路徑交點

卡常的水題

考慮 \(k=2\) 的情況,每種路徑方案都可以使用一個排列來描述,排列的逆序對數量就可以用來描述交點數。

因此,設矩陣 \(M\in R^{n_1\times n_1},M_{ij}=[(i,j)\in E]\)​​,那么自然而然地得到 \(k=2\) 時答案為:

\[\det(M)=\sum_{p}(-1)^{\sigma(p)}\prod_{j=1}^{n_1}M_{j,p_j} \]

考慮 \(n\)​ 相等的情況。由於 \(k>2\)​ 時,各層的逆序對為疊加關系,因此各層的行列式乘法時 \(-1\)​​​​​ 的指數就會相加,滿足系數要求;同時,將行列式相乘也相當於枚舉了每一種可能的方案,因此可以得到答案:

\[\prod_{j=1}^{k-1}\det(M_j)=\det(\prod_{j=1}^{k-1}M_j) \]

最后考慮 \(n\)​ 不相等的情況,根據 \(n_k=n_1\)​ 的限制不難想到 \(\det(\prod_{j=1}^{k-1}M_j)\)​ 就是答案。順向思考,考慮任意一種路徑方案,必然可以被描述為:首先,從 \(2\sim k-1\) 的每一層中選擇一個大小為 \(n_1\) 的子集,接着就化歸到了 \(n\) 相等的情況,最終我們需要對所有的子集方案求和;可以發現這就是 Cauchy-Binet 公式的形式,因此我們的猜想是正確的。

本題有億點卡常,不建議寫成矩陣乘法,建議寫成類似於 DP 的形式,最終復雜度即為 \(O(Tn_1\sum m)\)

D1T3 慶典

還不錯的題目。

簡單轉化:題目中“可能經過 \(u\)”等價於“既能從 \(s\) 到達 \(u\),也能從 \(u\) 到達 \(t\)”。

首先考慮 \(m=n-1\)​​ 的部分分,不難論證得出此時圖的形態必然是一棵外向樹。對於普通的點,它們僅能從祖先的點到達,僅能到達子樹內的點。而題目給出的 \(k\) 條邊僅僅會影響 \(2k\) 個點的可達性與到達性,其余的點的可達性、到達性仍然可以”借用“祖先的點和子樹的點來描述。

這樣,我們不難想到,最終可以經過的點就可以被描述為 \(2(k+1)\)​ 個關鍵點之間的某些鏈的並集。合法的鏈即”從 \(s\) 可以到達鏈頭,且從鏈尾可以到達 \(t\) 的鏈“。注意到 \(k\) 很小,因此可以暴力 Floyd 求出傳遞閉包,接着枚舉每條鏈,最后做一個樹上鏈並即可。

還需要注意,新加入的 \(k\)​ 條邊也可以被算作合法的鏈,但是顯然這樣的鏈只有端點有效,因此打一下標記即可。

最后解決 \(m\not=n-1\)​ 的情況,將強連通分量縮點之后,題目的性質在新圖上仍然滿足,縮點后直接跑。

小結:注意圖的形態,縮點后保持樹形注意答案的形態,一定是鏈並

復雜度可以做到 \(O(n\log_2n+qk^3)\)

D2T1 量子通信

不錯的亂搞題目,正好戳中我的痛點。

由於 \(k\le 15\)​,因此有變化的部分會很少;同時,如果我們將一個單詞划分為 \(16\)​ 段,每段長度即為 \(16\)​,那么 \(k\)​ 次修改最多會帶來 \(15\)​​ 段變化,也即,必然會有一段保持不變。因此對於詢問串,我們可以枚舉保持不變的一段,並檢查在枚舉段相同的單詞中是否有差異不超過 \(k\) 的單詞。

由於字典中的單詞隨機,因此每一段中,某種情況的單詞期望個數為 \(\frac{4\times10^5}{2^{16}}\approx 8\);此外,計算差異數可以用 __builtin_popcountll 做到 4 次運算,因而復雜度為 \(O(n+q)\),其中 \(n\) 的常數約為 64, \(q\) 的常數約為 512。

小結:一定要多多注意小數據的處理方式,在這道題中就根據較小的修改次數和較長的長度,運用鴿巢原理大幅縮減所需檢查的字符串的數量(這應該是查找類題目的重要思路)。

D2T2 密碼箱

容易發現 \(f\)​ 計算的是一個連分數:\([a_0;a_1,a_2,\dots,a_n]\)​​

考慮遞推計算,設 \(f_k=[a_k;a_{k+1},a_{k+2},\dots,a_n]=\frac{p_k}{q_k}\)​​;特別地,邊界 \(f_n=\frac{1}{a_n}\)​​。

那么遞推關系為:

\[f_k=a_k+\frac{1}{f_{k+1}} \]

也即:

\[\begin{aligned} p_k&=q_{k+1}+p_{k+1}a_k\\ q_k&=p_{k+1} \end{aligned} \]

這組遞推式有兩個作用:

第一,根據遞推式可以發現 \(\gcd(p_k,q_k)=\gcd(p_{k+1},q_{k+1})\),在邊界處 \(\gcd(p_k,q_k)=1\),因此中途結果均保持既約性質,不需要約分;

第二,遞推式是線性的,這表明遞推過程可以用矩陣來描述;設 \(F_k=\begin{bmatrix}p_k\\q_k\end{bmatrix},M_k=\begin{bmatrix}a_k&1\\1&0\end{bmatrix}\),則 \(F_k=M_kF_{k+1}\)

注意到這個轉移與 \(a\)​​​ 相關,而為了維護操作序列的變化,我們最好是將 WE 直接用矩陣來描述。

容易發現 W 其實就是矩陣 \(\begin{bmatrix}1&0\\1&1\end{bmatrix}\);而考慮 E 操作,當 \(a\) 的最后一個元素不為 1 的時候,E 等價於矩陣 \(\begin{bmatrix}1&0\\-1&1\end{bmatrix}\begin{bmatrix}1&1\\1&0\end{bmatrix}\begin{bmatrix}1&1\\1&0\end{bmatrix}\),而當 \(a\) 的最后一個元素為 1 的時候,這個矩陣乘上以后得到 \(\begin{bmatrix}1&1\\1&0\end{bmatrix}\begin{bmatrix}1&0\\-1&1\end{bmatrix}\begin{bmatrix}1&1\\1&0\end{bmatrix}\begin{bmatrix}1&1\\1&0\end{bmatrix}=\begin{bmatrix}1&0\\1&1\end{bmatrix}\begin{bmatrix}1&1\\1&0\end{bmatrix}\),施加上以后恰好等價於“先去掉最后一個元素,再給最后一個元素 +1,再在末尾添加一個 1”,也就是給倒數第二個元素 +1。

因此直接用平衡樹維護矩陣積即可,細節有億點多。

小結:從部分情況入手,逐步推廣的思路很好用;尤其是在本題中,E 的操作看起來構造性很強,其實也暗示它很有可能就是某一特殊情況簡單推廣后的結果。

D2T3 機器人游戲

非常棒的題目,質量很不錯

樣例 2 的解釋貼心地給出了容斥計算的解釋,直接模擬可以得到一個 \(O(2^nn^2m)\)​​ 或者 \(O(2^nnm)\)​​ 的容斥做法,這里就不詳細解釋了。

但是這個做法還需要優化。不難發現對於每個格子的四種操作:不變/賦 0/賦 1/取反 構成了一個群,以下我們分別用 0/1/2/3 表示這四種操作。

我們只需要考慮每個格子被操作覆蓋的情況即可計算出方案數。在較差的復雜度中,我們可以直接預處理每種情況的方案數;為了優化,我們需要細致分析。假如一個格子同時被 0,3 覆蓋,或者同時被 1,2 覆蓋,那么它只能輸入輸出都為空,因此方案數為 1;假如一個格子被 0/3 其一覆蓋,同時被 1/2 其一覆蓋,那么它除空外只有一種方案,因此方案數為 2;在其它情況下,方案數均為 3。

需要注意,如果某個格子並未被容斥集合中出發的每機器人次覆蓋住,那么該格子便隱式地被 0 覆蓋。

那么,對於任意容斥集合 \(P\)​,使用 unsigned 我們不難處理出操作 \(o\)​ 影響到的格子的集合 \(f_{P,o}\)​​,按照上面的分析處理出不同情況的位置集合計算即可。

如此我們得到了 \(O(2^nm)\) 的容斥。


為了方便描述,設 \(r_j\) 表示機器人 \(j\) 影響到的格子個數,也即字符串中 R 數量 +1。

注意到極限數據為 \(n=32\)​​​,恰好為 \(16\)​​ 的兩倍,這啟示我們折半處理容斥集合。對於僅包含左邊 \(16\)​​ 個位置的容斥集合,我們可以直接枚舉並計算;對於包含右邊 \(16\)​​​ 個位置中任意一個的容斥集合,我們注意到此時貢獻非 1 方案數的機器人必然滿足 \(r_j\le n-\max P\le \frac{n}{2}\),其中 \(P\subseteq \{0,1,2,\dots,n-1\},\exist p\ge \frac{n}{2},p\in P\)​​​​。

由於每個位置僅會受前 \(r_j\)​​​ 個位置影響,因此我們可以枚舉 \(P\)​​​ 中最大值后直接 DP,狀態 \(f_{i,S,0/1}\)​​ 表示前 \(i\)​ 個位置,其中 \([i-\frac{n}{2}+1,i]\)​ 的選擇情況為 \(S\)​,在 \([0,i-\frac{n}{2}]\)​ 中無/有選中的位置的情況下,容斥的結果。其中每個位置的貢獻也可以預處理,\(c_{S,0/1,k}\)​ 表示對於某一位置,若 \([i-\frac{n}{2}+1,i]\)​ 的選擇情況為 \(S\)​​​,在范圍外無/有選中的位置的情況下,所有 \(r_j\le k\)​ 的機器人的貢獻。

DP 結束后還需要計算最大值之外的位置的貢獻,用好 \(c\) 即可。

這部分復雜度為 \(O(m2^{\frac{n}{2}}+n^22^{\frac{n}{2}})\)


將兩個做法結合在一起即可得到正解。

小結:在降低復雜度的過程中,精細的分析是很有必要的,有時候需要借助比較暴力的預處理,不過在本題中仍需要進一步分析;此外,本題的復雜度平衡依托於當包含的元素都靠前時,容斥集合包含的位置較少;當包含的元素靠后時,有效的機器人 \(r\) 較小,出現這樣的 \(\min\)​ 限制的時候需要注意是否可以平衡復雜度。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM