牛客挑戰賽36 E&F


E

考慮一個人 \((a_i,b_i)\) 滿足什么條件會自閉。設比其能力值低的人的數量為 \(p\),現在已經有 \(l\) 個能力值比其低的人退出,\(r\) 個能力值不比其低的人退出,那么 TA 在下一場考試中不自閉需要滿足不等式 \((p-l)a_i \geq n-r-l-1\),即 \(l(a_i-1)-r \leq pa_i-n+1\)

對於一個人的離開對於其他人的 \(l,r\) 會產生一定影響,對 \(r\) 產生的影響好辦,但是對 \(l\) 產生的影響不易處理。單獨把不等式中的 \(l\) 拿出來考慮,令 \(a_i \neq 1\),不等式等價於 \(l \leq \frac{pa_i+r-n+1}{a_i-1}\)

\(mx_i = \frac{pa_i+r-n+1}{a_i-1}\)\(mx_i\) 會隨着 \(r\) 的增加變大。可以考慮維護每一個人的 \(mx_i\)\(l_i\)\(l_i\) 就變得易於維護,但是 \(mx_i\) 好像不太好辦。

注意到 \(r\) 的最大增量為 \(n\),而每種 \(a_i\) 至多出現兩次,所以 \(mx_i\) 在整個過程中的增量之和是不會超過 \(2(\sum\limits_{j=1}^\frac{n}{2} \frac{n}{j}) = O(n \log n)\) 級別的。這樣如果我們能夠以較快的復雜度定位到進行一次修改之后將要變大的 \(mx_i\) 並將其修改,那么修改次數就是 \(O(n \log n)\) 的。

使用線段樹,每一個節點維護以下兩個信息:

  • 該節點對應區間中 \(mx_i - l_i\) 的最小值;
  • 對該節點對應區間的所有 \(r_i\) 進行區間 \(+1\),至少進行多少次使得存在一個 \(mx_i\) 相比當前記錄的值變大。

一次退出可以對應這兩個信息的區間修改。找到需要修改的 \(mx_i\) 可以利用第二個信息在線段樹上進行尋找,如果當前第二個信息的值 \(>0\) 則無需修改,否則進入左右兒子進行修改。而找到需要退出的人則可以利用第一個信息進行類似的尋找。需要在預處理時特殊處理 \(a_i = 1\) 的情況。

復雜度 \(O(n \log^2 n)\)

F

首先任意一個購買方案都可以用一個購買序列描述,我們按照該序列依次購買土地,不考慮並沒有購買完該序列中的所有土地之前達成條件的情況(此時購買序列應該是當前序列的前綴),購買完這些土地之后坐等滿足條件。下文中的所有購買序列都是表示這樣的意思。

對最優的購買方案進行分析,可以得到以下結論:

  • 對於一個購買序列,最優的購買方案一定是能買就買,即依次考慮該序列中的土地,如果當前能夠買下則立即買下,否則不斷攢錢直到恰好可以買下該土地時立即購買。

Proof. 因為購買花費的總代價確定,所以每天的收益越多越好,而在這樣的貪心策略下能夠讓每一天的收益均最大化,故為最優策略。

接下來的討論均建立在該最優策略之上。


  • 對於一個購買序列 \(p_1,p_2,\ldots,p_k\),設在最優策略下在第 \(q_i\) 天購買 \(p_i(i \in [1,k])\) 號土地,在買下該土地之后剩余錢數為 \(w_i\)。如果 \(q_i \neq 0\),則 \(w_i < \sum\limits_{j=1}^{i-1}b_i\)

Proof. 若 \(w_i \geq \sum\limits_{j=1}^{i-1}b_i\) 則可以在第 \(q_i - 1\) 天就買下該土地,不符合最優策略。


  • 對於兩個購買序列 \(p_1,p_2,\ldots,p_m\)\(q_1,q_2,\ldots,q_n\),其中 \(\sum\limits_{i=1}^m b_{p_i} = \sum\limits_{j=1}^n b_{q_j}\)。在最優策略下,設按照兩個序列購買下 \(p_m\)\(q_n\) 的天數分別為 \(T_p\)\(T_q\)。如果 \(T_p \neq T_q\) 則天數較小的購買序列答案一定更小,反之則剩余錢數較多的答案一定更小。

Proof. \(T_p = T_q\) 的情況是顯然的,對於 \(T_p \neq T_q\) 的情況不失一般性地假設 \(T_p < T_q\)。那么在 \(T_q\)\(p\) 方案手上擁有的錢數 \(\geq \sum\limits_{i=1}^m b_{p_i}\),而根據上面的結論 \(q\) 方案手上擁有的錢數 \(< \sum\limits_{i=1}^m b_{p_i}\),故 \(p\) 方案更優。

也就是說我們現在可以量化在購買土地的總收益相等的情況下哪一個序列是最優的方案了,也就是以購買完所有土地的時間為第一關鍵字、買完所有土地時剩余的錢為第二關鍵字的最小方案。接下來我們需要知道如何找到這樣的方案。


  • 對於一個購買序列 \(p_1,\ldots,p_k\),如果這個序列是在與其總收益相等的所有序列中最優的序列,則其任意前綴也會是在與這個前綴總收益相等的所有序列中最優的序列。

Proof. 如果不滿足,則換成對應前綴的最優序列更優。

這樣可以發現最優的購買序列滿足子問題性質。考慮 DP:設 \(f_i\) 表示總收益為 \(i\) 的所有序列中最優序列的買下所有土地的時間和買下所有土地時剩余的錢。轉移枚舉下一個土地買誰即可。復雜度 \(O(n \max c_i)\)


找到了 \(f_i\) 后考慮一組詢問 \((c_i,d_i)\) 如何解決。枚舉最后一次購買后土地總收益 \(p\),那么最優的方案一定是 \(f_p\) 對應的方案。而如果選擇了 \(f_p\) 對應的方案作為最優方案,則忽略在購買完所有土地之前的部分,其收益與時間的圖像構成一條直線。我們需要求出 \(f_1 \sim f_{c_i}\) 這些直線最小在橫坐標為多少的時候縱坐標大於等於 \(d_i\),對於所有 \(d_i\) 能夠作為最小橫坐標的直線顯然構成一個下凸殼,將詢問離線並按照 \(c_i\) 從小到大排序,然后依次加入直線維護下凸殼,每一次詢問在凸殼上二分找到最優點即可。

最后一個問題是在實際操作過程中需要將 \(f_p\) 看做完整的一條直線,如果最優的直線恰好是 \(f_p\) 對應直線且對應橫坐標小於購買完 \(f_p\) 最后一塊土地的時間,算法就 GG 了。但是由於 \(f_p\) 對應序列的任意前綴都一定已經加入,且這些直線在橫坐標小於購買完 \(f_p\) 最后一塊土地的時間的任意一個橫坐標的最大值一定大於 \(f_p\) 直線的對應位置的值,所以並不會存在這樣的情況。

總復雜度 \(O(n \max c_i + (q + \max c_i) \log \max c_i)\)


免責聲明!

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



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