contents
有 中文題目,那就不多做解釋,咱們直接來坑題解。由於我沒有參與比賽,目前也沒辦法進行 submit 測試我的代碼跟算法正確性。因此以下內容、代碼僅供參考。
題目已經放在 E-tutor,但沒提供測試功能,不能 submit 的 OJ 相當逗趣,再等幾天吧,也許在調數據的時間,或者是根本不打算弄好 … 也許是下一次舉辦比賽才完成。
看過一次題目,大約有下列特徵算法 模擬、Bfs、樹形 dp、拓樸排序、最短路徑、dp、二分圖最大匹配、搜索優化、矩形并、掃描線、二分答案。有一題沒看懂,對於那題多維度部分,可能需要的是假解搜索。
有提供中文題目描述呢,不確定自己是否都看得懂,當然程式有點 bug 的話,歡迎大家來 challenge。
感謝各位提供的解法!讓我更了解 BWT $O(n)$ 逆變換。
Problem A
每一輪進行投票,將少數票的那一方留下,直接模擬運行即可,UVa 也有類似的題目。
|
|
Problem B
兩個機器人運行的行動和週期不同,用 timeline 的方式去模擬兩台機器人的狀態,利用 time mod (N + E)
來得到當前屬於前 N 還是後 E。
|
|
Problem C
樹中心 (把一點當根,到所有葉節點距離最大值越小越好),其中一種方法是使用樹形 dp,另外一種方法是拓樸排序。保證樹中心會在最長路徑上的中點,當最長路徑是偶數個頂點構成,則中心會有兩個代表,反之會有一個。只會有這兩種情況。
那麼拓樸排序拔點,順便紀錄拓樸的深度 (分層去看),看最後一層有一個點、還是兩個點,找字典順序最小的。
|
|
Problem D
Bfs 搜索,定義狀態為 dist[x][y][dir]
表示從起點到 (x, y) 時,利用 dir 方向上的門進入的最短路徑,接著按照 Bfs 搜索到目的地。
|
|
Problem E
題目沒看懂,一扯到多維度計算,似乎每年都是同一個出題者嗎?有一種既視感。
Problem F
可以參照 Zerojudge 基因的核,找到多字串的 LCS 長度。但是這一題要求找到所有 LCS,而且還要按照字典順序排好,同時也不能輸出重複的。根據討論,輸出結果可能破百萬,那麼從輸出檔案中得知,這有點不科學大小,光是輸出有可能就會 TLE。
下方的代碼也許只有長度輸出是正確的,在輸出解部分有點問題,假設答案總數並不多,為了加速排序部分以及重複回溯,使用 trie 來輔助完成。若答案總數過多,會使得 trie 記憶體滿溢。
|
|
Problem G
看起來是一題二分圖找最大匹配數,可以利用 maxflow 或者是匈牙利算法得到。
|
|
Problem H
如果摩擦力和位能動能互換是連續的,那這一題的作法可能就會有問題。很明顯地為了要求出起點到終點的最少能量需求,必然希望最後到終點的能量恰好為 0,因此逆推最少能量消耗,從終點推論到起點。
|
|
Problem I
快速找到多少對的漢明距離恰好相差 P,保證任兩個字串不同,暴力法是直接 $O(N^2)$ 進行比較。由於字串長度不長,可以考慮一下到底要怎麼優化。這一題突然可以想到 UVa 1462 - Fuzzy Google Suggest,但是那一題考慮到字符串長度會比較長,而且還有編輯距離的搜索,跟漢明距離有點差別,也是值得思考的題目。
由於字串長度為 4,只使用大寫字母和數字,下面測試想法 5 組 50000 個的字串,大約跑了 4 秒,不曉得能不能通過正式比賽的數據。想法很簡單,窮舉相同的位置後,利用排容原理找完全不同的字串數量。
例如給定 ABCD
,此時 $P = 2$,那麼找到符合 A_C_
所有的情況,符合配對的字串保證有相似程度有 2 個,但是這些情況可能會出現 ABC_
、A_CD
、ABCD
,也就是說為了找到符合 A_C_
,__
不能填入 BD
的任何相似,計算排容得到完全不相似 (有一個相同的位置) 的個數。
Version 1
直接用字串進行檢索。
|
|
Version 2
將字串轉數字當作索引值加快速度。
|
|
Version 3
發現排容地方寫得不恰當,善用排容原理的組合計算,類似 N 不排 N 的組合數 (錯排)。map 查找會慢很多,就算用分堆的 map 效率仍然提升不高,那麼直接開一個陣列空間 $O(37^4) = O(1874161)$,所有字串轉數字,雖然清空會慢很多,但是查找速度夠快。
感謝蚯蚓、卡車告知這問題。
|
|
Problem J
考了一題 BWT 壓縮的逆轉換,從簡單的思路至少要 $O(N^2 log N)$ 吧?沒想到的是利用特性可以達到 $O(N)$。這裡需要研究一下 為什麼相同字母順序在壓縮和解壓縮會相同 ,百思不解的就是這個地方,若是能解決,就直接利用輔助數組達到 $O(N)$ 逆推上一個元素是什麼,最後輸出一個反向的結果。
這裡解釋一下順序性問題
|
|
明顯地左側的 A
順序會跟右側的 A
順序相同,原因是 B----A < NAB--A < NAN--A
,那麼保證 AB----, ANAB--, ANAN--
一定也會出現 (根據 $O(N^2 log N)$ 的做法得到,因為他們是循環的!),既然後綴順序已經排序 (B----A, NAB--A, NAN--A
),那麼右側中,相同的字母順序,肯定跟左側一樣 (由小到大)。
藉此可以推導下一個字母到底是何物!例如結尾字母是 A(4)
,那麼前一個一定是 B(11)
,而 B(11)
對應右側的 B(12)
,B(12)
的前一個是 A(3)
,A(3)
對應右側 A(6)
…
|
|
Version 1
|
|
Version 2
蚯蚓的寫法順推。
|
|
Problem K
二分答案 + 掃描線,來找到是否矩形并的面積等於所求的整個面積。算法的複雜度是 $O(N \log^2{N} )$,如果太慢的話就懇求各位幫忙。
掃描線部分,將每個平行兩軸的矩形保留垂直的邊,水平的邊不影響運算結果。接著按照 X 軸方向由左往右掃描,將矩形左側的垂直邊當作入邊 +1
、右側的垂直邊當作出邊 -1
,維護 Y 值的區間覆蓋。
假設 Y 可能是實數,需要針對 Y 進行離散化處理,接著懶操作標記,對於線段樹的某個區間,若覆蓋數 cover = 0
則表示該區間無法提供,相反地提供整個區間。
註記 邪惡的 $\text{round}(\sqrt{k} \times c)$ ,不小心看成 $\text{round}(\sqrt{k}) \times c$
感謝蚯蚓告知這問題。
|
|
後記
如有錯誤,多多包涵。