Wannafly 挑戰賽 19 參考題解

2022-05-12 18:38:44 字數 2468 閱讀 9767

這一次的 wannafly 挑戰賽題目是我出的,除了第一題,剩餘的題目好像對大部分演算法競賽者來說好像都不是特別友好,但是個人感覺題目質量還是過得去的,下面是題目鏈結以及題解。

【題目鏈結】

wannafly 挑戰賽 19 參考題解

problem a. 佇列 q

將操作離線倒序處理,可以線性效率解決這個問題。看**很快就能懂了,不再贅述。

時間複雜度:$o(n + q)$

problem b. 矩陣

首先看乙個問題:有乙個長度為 $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 + _^$ 條。

將顏色進行狀壓,$t_i$ 表示顏色集合小於等於 $i$ 的路徑數量,計算 $t_i$ 只要保留顏色是狀態 $i$ 中的節點,求連通塊後,每個連通子樹計算方案數累加即可。

得到 $t_i$ 之後,可以通過減去子集的路徑數量,得到顏色集合恰好為 $i$ 的路徑數量。

時間複雜度:$o(2^k*n)$

problem d. 回文

上述思路可以用 manacher 以及記錄一些值的字首字尾的最小值來實現。

時間複雜度:$o(|s|)$

problem e. 集合

這題**量有一點大,容易寫錯,思路本身並不難。

$cost_$ 表示 $a$ 集合的第 $i$ 個元素和 $b$ 集合的第 $j$ 個元素,通過修改操作變換成相同的元素,需要的花費為 $cost_$,若無法通過修改操作變成相同的元素,則 $cost_$ 為 inf。$cost_$ 可以通過廣度優先搜尋來得到。

接下來就是乙個二分圖最小費用匹配問題,可以用最小費用最大流來解決。

源點向 $a$ 集合的每乙個元素 $i$ 建邊,流量為 $1$,費用為 $0$。

$b$ 集合的每乙個元素 $j$ 向匯點建邊,流量為 $1$,費用為 $0$。

$a$ 集合的每乙個元素 $i$ 向 $b$ 集合的每乙個元素 $j$ 建邊,流量為 $1$。如果 $cost_$ 為 inf,則費用為 $da_i + db_j$,表示這兩個元素配對的方式只能是兩者都刪除;如果 $cost_$ 不為 inf,那麼費用為 $\min(da_i + db_j, cost_ * \min(ma_i, mb_j))$,表示這兩個元素配對可以選擇變換也可以選擇直接刪除,選擇少的那一種費用。

此外,在元素個數較少的那一側,還需要新增乙個節點 $p$,用來刪除另一側多餘元素。如果是 $a$ 集合的元素比 $b$ 集合的元素少,那麼源點和 $p$ 之間建邊,流量為 $|b-a|$,費用為 $0$;$p$ 和 $b$ 集合中的每乙個元素 $j$ 建邊,流量為 $1$,費用為 $db_j$。

上述圖,從源點到匯點跑最小費用最大流,跑出來的費用即為答案。

時間複雜度:$o(n * _^ * 16^2 + f*v*e)$,其中前半部分為 bfs 計算 $cost$ 的複雜度,後半部分為最小費用最大流的複雜度。

problem f. k 串

$s_$ 表示字首 $[1,i]$ 中,第 $j$ 種字母的數量對 $k$ 取模的結果。每個位置的 $s_i$ 都可以看作是乙個 $26$ 元組,每次詢問就相當於詢問區間 $[l, r]$ 中有多少對相同的 $26$ 元組。

可以將 $26$ 元組進行 hash 成乙個數字或者可以將 $26$ 元組插入字典樹進行操作。之後就是《小 z 的襪子》了,利用莫隊演算法即可。

hash 做法的時間複雜度:$o(n\sqrt \log )$

字典樹做法的時間複雜度:$o(n\sqrt * 26)$

寫在入職前:

畢業 20 來天了,我這個蒟蒻呢,明天就要入職微軟蘇州了。這場比賽以及三月份的校賽命題是我離開學校、上班之前對大學 acm 演算法競賽生涯的兩次總結,對於命題,我完全把它當做是一種創作而非任務,我想創作出很優秀、很耐人尋味的試題,猶如 vae 能寫出很優美的旋律、很有思想的歌詞一般。

這些年挺開心的,雖然從結果來看並沒有做到很棒,但是我真的很享受這四年時光,我慶幸能夠認識很多很多好朋友,無論是學習上、生活上,還是思想上、**上能聊得來的朋友們,我都很感謝很感謝。

對現在的狀態呢,我也不是很完全滿意,我還要繼續努力。

恍若隔世的四年啊,真的猶如做了一場夢,我希望一直活在這場夢裡,希望這場夢能越來越好。

最後,謝謝各位的參賽,祝所有朋友們前程似錦,心想事成!

Wannafly挑戰賽 19 A 佇列Q 思維

這道題剛開始我的想法是用兩個棧分別去存first和last所操作的數,用map標記入棧的數,然後先將first棧中的數輸出,然後再遍歷陣列輸出沒有被標記的數,最後再輸出last棧中的數,雖然我覺得沒什麼問題吧,但是只過了5 的樣例。能ac的方法就是首先我們要從100000開始輸入資料 至於為什麼等會...

牛客 wannafly挑戰賽19 A 佇列

zzt 創造了乙個佇列 q。這個佇列包含了 n 個元素,佇列中的第 i 個元素用 qi 表示。q1 表示隊頭元素,qn 表示隊尾元素。佇列中的元素是 n 的乙個全排列。zzt 需要在這個佇列上執行 p 次操作,操作分兩種 first x 將元素 x 移到隊頭。last x 將元素 x 移到隊尾。在 ...

Wannafly挑戰賽A 概率DP

給你乙個長 n 的序列,m 次查詢 每次查詢給乙個 x,然後 從序列的最左端 1 開始,每次隨機的選擇乙個右端點 r,如果兩個端點間的區間和不超過 x 就進行一次分割,然後把左端點變成 r 1,否則一直隨機下去。問這樣分割出來的期望段數 第一行兩個數 n,m 之後一行 n 個數表示這個序列 之後m行...