CF1941 BCDEF 題解

XYukari發表於2024-03-18

B

如果要將 \(a_1\) 刪成 0,只能對 \(a_2\) 進行操作:\(a_1\gets 0,a_2\gets a_1-2\times a_1,a_3\gets a_3-a_1\)\(a_1=0\) 後,要將 \(a_2\) 刪成 0,只能對 \(a_3\) 進行相同的操作;要將 \(a_3\) 刪成 0,只能對 \(a_4\) 進行相同的操作……依此類推。可以看出,這是唯一可行的刪除方法。

不難發現,如果整個陣列能夠刪空,那麼對 \(a_{n-1}\) 操作後,我們將同時得到 \(a_{n-1}=a_n=0\),此時答案為 YES,否則答案為 NO。當然,如果在中途發現操作進行不了,比如對 \(a_3\) 操作時發現 \(a_3<2\times a_2\),刪完之後會出現負數,則陣列一定刪不空,直接輸出 NO 後 break 即可。

遍歷一次陣列,時間複雜度 \(O(n)\)

C

如果 mappie 單獨出現,應該直接刪除中間的字母 ai——如果遇到 mmap 或者 piee 這樣的字串,刪除頭尾的字母可能消不掉該單詞。而當出現 mapie 子段時,顯然應該刪除 p

遍歷字串,當 s[i:i+5] == "mapie" 時,答案 +1,迴圈變數 +5;否則檢查 s[i:i+3] == "map || s[i:i+3] == "pie",成立則答案 +1,迴圈變數 +3。時間複雜度 \(O(n)\)

D

用 unordered_set 記錄每一輪球可能在的位置,每一輪對 set 中的所有元素進行更新。元素最多出現在 \(n\) 個位置,共有 \(m\) 輪,注意最後要對答案排序,時間複雜度 \(O(nm+n\log n)\)

E

先求出在每一行架橋的最小值,再用字首和求出連續 \(k\) 行的最小和,這要求每一行求最小值的複雜度不超過 \(O(m)\)

動態規劃,考慮設 \(dp_{i,j}\) 表示第 \(i\) 行架橋,在第 \(j\) 列放了橋墩時截至該列的最小造價,顯然有 \(dp_{i,j}=\min_{t=j-d-1}^{j-1}dp_{i,t}+a_{i,j}+1\)。複雜度 \(O(md)\) 的求最小值部分可以單調佇列最佳化至 \(O(m)\),滿足條件。

F

要讓「最大差值」最小,必須將新問題插入間隔最遠的那對 \(a_i,a_{i+1}\) 之間,答案為「次大差值」和「最大差值分開的兩段」取 \(\max\)。「次大差值」本身不會改變,我們只需要研究怎樣分隔「最大差值」能使答案最小。

列舉 model,對每個 model 二分出一個 function,使得 \(d_i+f_j\le \lfloor\dfrac{a_{i}+a_{i+1}}{2}\rfloor\)\(f_j\) 最大。對於這個 model,最優的分界點是 \(d_i+f_j\) 或者 \(d_i+f_{j+1}\)。用這兩個可能的分界點和「次大差值」分別更新答案即可。

複雜度 \(O(n+m\log k)\)