1. 程式人生 > 其它 >【學習筆記】<遇到困難睡大覺>命題報告

【學習筆記】<遇到困難睡大覺>命題報告

程式碼正在火速趕來

遇到困難睡大覺

一點想說的話,和題目沒有關係就摺疊起來了

解題過程很長,看這篇論文的時候我也一度質疑我究竟是不是有足夠的耐心來進行更為困難的問題的研究,甚至參與複雜問題的解決;也產生了大量類似於 “我學了這麼久 OI 連這麼點耐心都沒有培養起來” 的想法並深陷自閉中。

但是方法論就是方法論,題目一步步的推理邏輯和題目之外的冗餘想法是毫不相關的,一味捂著臉揉眼睛確實對做出題目一點幫助沒有。即使對符號語言不那麼敏感,但是沿著搭建好的邏輯大路一步步向前走總是沒問題的。

無論何時,都希望你在完成題目的時候拋開題目本身邏輯之外的雜念吧!


如果強制所有的 \(b_{p_i}+i\times k\) 不超過給定的 \(M\)

,求最滿足條件的最大的 \(a_{p_i}+i\times k\) 是基礎的,此時不難得到 \(r_i=\lfloor\frac{M-b_i}k\rfloor\) 表示 \(b_i\) 能放置的右界點

這是可以將所有 \(r_i\) 排序後用堆找到最有決策,列舉 \(1\sim n\) 的每個 \(b_i\) 放到 \(1\sim n\) 的每個位置,要進行一共 \(\Theta(n^2)\)\(M\) 的判定,複雜度 \(\Theta(n^3\log n)\)

上面的貪心過程還可以被刻畫成按照 \(r_i\) 從小到大,\(a_i\) 從大到小找一個空位,每次找合法區間裡面最大的即可,可以使用並查集來優化,可以去掉 \(\log\)

接下來的每個部分都需要一定程度的觀察

考慮到 \(r_i\) 的相對大小關係是和 \(M\) 無關的,而題目中所需求的 \(\min\{a_{p_i}+i\times k\}-\max\{b_{p_i}+i\times k\}\) 是和 \(i\) 的相對大小而非絕對大小相關的,所以我們大可將下標平移到 \(t\sim t+n-1\) 來做,也就是說 \(r_i\) 不受制於 \(1\sim n\) 了,只要是連續的 \(n\) 個正整數即可

觀察到 \(M\to M+k\) 時每個 \(r_i\) 都增加了 \(1\) 但是這和不增加時問題本質相同,所以原來要判定 \(\Theta(n^2)\)

次,現在可以減少到 \(\Theta(\min(n^2,k))\)

考察 “每個數字填入一個位置,同時受一個填入右端點限制” 發現這和二分圖匹配是完全相同的,那麼問題就是找到存在的合法完美匹配中最大的 \(\min\{a_{p_i}+i\times k\}\)

首先判定是否存在一個完美匹配,使用 \(\rm Hall\) 定理可以發現將 \(r_i\) 排序之後得到 \(t=\min\{r_i-i+1\}\) 就是最大值

注意 \(r_i\)\(M\) 固定時界還要和 \(t+n-1\)\(\min\),所以選擇最大的 \(t\) 判定即可,那麼判定數量降至 \(\Theta(\min\{n,k\}n)\),可以得到 \(50\)

嘗試二分最後的答案 \(\rm mid\),那麼每個元素還會有放置的上界 \(l_i=\lceil\frac{M+mid-a_i}k\rceil\),仍然根據 \(\rm Hall\) 定理,設 \(s(l,r)\) 表示被 \([l,r]\) 包含的 \((l_i,r_i)\) 個數,如果滿足 \(r-l+1-s(l,r)\ge 0\) 那麼存在完美匹配

非常直接的做法還是列舉每個要判定的 \(M\),求出來 \(l_i,r_i\) 並二維數點即可

最終的標算是考慮 \(M\in[0,k)\) 不斷增加的過程中 \(l_i,r_i\) 只會增加一次,記其為 \(tl_i,tr_i\),問題變成了找到合法的 \(M\),設 \(q(l,r)=r-l+1-s(i,j)\)

其實本質上需要考慮的 \((l,r)\) 是不同的 \(s(l,r)\),也可以寫作 \(i,j\in[1,n],s(l_i,r_j)\),上面說得很清楚相對大小是不變的,那麼 \(s(l_i,r_j)\) 不變,仍然可以掃描線,而變的是 \(l_i,r_j\),分別在 \(tl_i,tr_j\) 處變

如果存在 \(q(l_i,r_j)<-1\) 一定不合法,同時也不用考慮 \(q(l_i,r_j)>1\)\(i,j\)

對於 \(q(l,r)=-1\) 的情況,當 \(r\) 增大且 \(l\) 沒增大的時候合法,否則不合法

對於 \(q(l,r)=0\) 的情況,當 \(l\) 增大且 \(r\) 沒增大時不合法,否則合法

那麼發現對於相同的 \(r\)\(l\) 變化時間最小者(\(\min\{tr_i\}\))就是最緊的限制

具體而言,要求的是 \(q(l,r)\) 的最小值,線上段樹上按照 \(l_i\) 的從小到大每個葉子上放 \((-l_i,\Delta l_i)\),同時維護區間最小的 \(-l_i\) 和對應最小的 \(\Delta l_i\)

注意我們需要取出的是可能的 \(q(i,j)=0/-1\) 的限制,那麼需要維護 \(l_i\) 最小和次小兩個二元組,真實的 \(q(i,j)\) 還要加上當前的 \(r_i+1\)

對應的修改操作就是遇到一個 \(r_i\) 就給 \([1,l_i]\) 這個區間減一來表示更新 \(s(l,r)\)

這樣子我們就在 \(\Theta(n\log n\log A)\) 的時間複雜度內解決了這個問題