APIO2020 簡要題解


現場得分 \(28 + 100 + 26 = 154\)

\(A\)
首先 , 考慮動態規划。
\(f_{i,j}\) 表示前 \(i\) 段牆壁 , 交給第 \(j\) 個及之前的承包商粉刷 , 最多匹配的長度。
注意到 \(f_{i}\) 之和 \(f_{i - 1}\) 有關 , 因此可以用滾動數組來優化空間復雜度。
這樣就求出了第 \([i - m + 1 , i]\) 這段區間的牆壁是否可以被某個承包商粉刷。
將所有可以的位置排序 , 然后貪心地盡可能往后放即可。
時間復雜度 : \(O(N)\)
代碼 : https://loj.ac/submission/922889

\(B\)
首先考慮一個 \(O(NMlogN)\) 的做法。
二分答案 \(mid\) , 保留圖中權值不超過 \(mid\) 的邊 , 如果圖中有環或度數超過 \(2\) 的點 , 那么就符合要求。
這是因為可以讓一輛車在一個節點處停留 , 等另一輛車到達目的地后再繼續開。
這樣可以得到 \(37\) 分。
接着 , 考慮克魯斯卡爾重構樹 , 對於重構樹上每個節點記一個權值 , 代表的是這個聯通塊最早符合要求是什么時候。
回答詢問時 , 先求出 \(u\)\(v\) 的最近公共祖先 。 再倍增至第一個權值非空的節點 , 即可。
時間復雜度 : \(O((N + M)logN)\)
代碼在考場上。

\(C\)

首先找出這棵樹的重心。 這需要花費 \(2M\) 次操作。
注意到每個點的度數不超過 \(3\)
如果重心的度數為 \(2\) , 由重心的性質 , 兩棵子樹大小差不超過 \(1\) , 每次取不同於上次所選的那棵子樹中 , 剩下的深度最大的節點來構造出一種合法方案。
如果度數為 \(3\) , 延續剛才的思路 , 每次取不同於上次所選的兩棵子樹中剩余深度最大的節點。
這樣做必然有一時刻 , 某兩棵子樹的大小和等於另一棵子樹的大小。 其正確性在於 :
記函數 \(V = 2 \cdot max{size} - sum{size}\) , 由重心的性質得到函數 \(V\) 的初值小於 \(0\)
這個函數在每次操作后的變化量為 \(1\) , 因此一定存在某一時刻滿足 \(V = 0\)
因此 , 在這個時刻到來時 , 將兩棵較小的子樹合並 , 用度數等於 \(2\) 的方法處理即可。
總操作數 \(4M\)。時間復雜度 : \(O(NlogN)\)
代碼 : https://loj.ac/submission/926697


免責聲明!

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



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