這一次的 Wannafly 挑戰賽題目是我出的,除了第一題,剩餘的題目好像對大部分算法競賽者來講好像都不是特別友好,可是我的感受題目質量仍是過得去的,下面是題目連接以及題解。html
【題目連接】算法
Wannafly 挑戰賽 19 參考題解ubuntu
命題:周甄陶學習
Problem A. 隊列 Qspa
將操做離線倒序處理,能夠線性效率解決這個問題。看代碼很快就能懂了,再也不贅述。code
時間複雜度:$O(N + Q)$htm
Problem B. 矩陣blog
首先看一個問題:有一個長度爲 $N$ 的序列 $A$,對於每個位置 $i$,計算以 $i$ 位置爲結尾的最大子串和,且子串的左端點位置必須大於等於 $L_i$。數據保證 $L_i$ 是非遞減的。隊列
設 $S_i$ 爲 $A$ 的前綴和,則以位置 $i$ 爲結尾的子串和爲 $S_i - S_j$,在區間 $[L_i - 1, i]$ 內枚舉位置 $j$ 找到 $S_j$ 的最小值就能夠計算出以 $i$ 爲結尾的最大子串和。這個問題利用單調隊列是能夠 $O(N)$ 解決的。字符串
上述問題解決後,再來看這題:
能夠枚舉答案矩陣的上下邊界,處理成一維的,題目中的第二個約束和第三個約束能夠處理出 $L_i$, 以後的問題就變成了上述那個問題了。
時間複雜度:$O(R*C*C)$
Problem C. 多彩的樹
一棵 $P$ 個節點的樹中,路徑數總共有 $P + { C }_{ P }^{ 2 }$ 條。
將顏色進行狀壓,$T_i$ 表示顏色集合小於等於 $i$ 的路徑數量,計算 $T_i$ 只要保留顏色是狀態 $i$ 中的節點,求連通塊後,每一個連通子樹計算方案數累加便可。
獲得 $T_i$ 以後,能夠經過減去子集的路徑數量,獲得顏色集合剛好爲 $i$ 的路徑數量。
時間複雜度:$O(2^K*N)$
Problem D. 迴文
先考慮答案的來源:確定是以某個位置爲迴文中心,留下最長迴文半徑,而後單邊保留一些或不保留字符,而後砍掉多餘部分,最後在另外一側補全,使得字符串成爲迴文串。
上述思路能夠用 manacher 以及記錄一些值的前綴後綴的最小值來實現。
時間複雜度:$O(|S|)$
Problem E. 集合
這題代碼量有一點大,容易寫錯,思路自己並不難。
$cost_{i,j}$ 表示 $A$ 集合的第 $i$ 個元素和 $B$ 集合的第 $j$ 個元素,經過修改操做變換成相同的元素,須要的花費爲 $cost_{i,j}$,若沒法經過修改操做變成相同的元素,則 $cost_{i,j}$ 爲 inf。$cost_{i,j}$ 能夠經過廣度優先搜索來獲得。
接下來就是一個二分圖最小費用匹配問題,能夠用最小費用最大流來解決。
源點向 $A$ 集合的每個元素 $i$ 建邊,流量爲 $1$,費用爲 $0$。
$B$ 集合的每個元素 $j$ 向匯點建邊,流量爲 $1$,費用爲 $0$。
$A$ 集合的每個元素 $i$ 向 $B$ 集合的每個元素 $j$ 建邊,流量爲 $1$。若是 $cost_{i,j}$ 爲 inf,則費用爲 $da_i + db_j$,表示這兩個元素配對的方式只能是二者都刪除;若是 $cost_{i,j}$ 不爲 inf,那麼費用爲 $\min(da_i + db_j, cost_{i,j} * \min(ma_i, mb_j))$,表示這兩個元素配對能夠選擇變換也能夠選擇直接刪除,選擇少的那一種費用。
此外,在元素個數較少的那一側,還須要新增一個節點 $P$,用來刪除另外一側多餘元素。若是是 $A$ 集合的元素比 $B$ 集合的元素少,那麼源點和 $P$ 之間建邊,流量爲 $|B-A|$,費用爲 $0$;$P$ 和 $B$ 集合中的每個元素 $j$ 建邊,流量爲 $1$,費用爲 $db_j$。
上述圖,從源點到匯點跑最小費用最大流,跑出來的費用即爲答案。
時間複雜度:$O(N * { C }_{ 16 }^{ 8 } * 16^2 + F*V*E)$,其中前半部分爲 bfs 計算 $cost$ 的複雜度,後半部分爲最小費用最大流的複雜度。
Problem F. K 串
$S_{i,j}$ 表示前綴 $[1,i]$ 中,第 $j$ 種字母的數量對 $K$ 取模的結果。每一個位置的 $S_i$ 均可以看做是一個 $26$ 元組,每次詢問就至關於詢問區間 $[L, R]$ 中有多少對相同的 $26$ 元組。
能夠將 $26$ 元組進行 hash 成一個數字或者能夠將 $26$ 元組插入字典樹進行操做。以後就是《小 Z 的襪子》了,利用莫隊算法便可。
hash 作法的時間複雜度:$O(N\sqrt { N } \log { N } )$
字典樹作法的時間複雜度:$O(N\sqrt { N } * 26)$
-----------
寫在入職前:
畢業 20 來天了,我這個蒟蒻呢,明天就要入職微軟蘇州了。這場比賽以及三月份的校賽命題是我離開學校、上班以前對大學 ACM 算法競賽生涯的兩次總結,對於命題,我徹底把它當作是一種創做而非任務,我想創做出很優秀、很回味無窮的試題,猶如 Vae 能寫出很優美的旋律、頗有思想的歌詞通常。
這些年挺開心的,雖然從結果來看並無作到很棒,可是我真的很享受這四年時光,我慶幸可以認識不少不少好朋友,不管是學習上、生活上,仍是思想上、音樂上能聊得來的朋友們,我都很感謝很感謝。
對如今的狀態呢,我也不是很徹底滿意,我還要繼續努力。
恍若隔世的四年啊,真的猶如作了一場夢,我但願一直活在這場夢裏,但願這場夢能愈來愈好。
最後,謝謝各位的參賽,祝全部朋友們前程似錦,心想事成!