JOISC 亂寫


「JOISC 2020 Day4」首都城市

進行點分治,考慮最終的連通塊是否經過當前分治中心,若經過,則當前分治中心的顏色必選,否則分治遞歸處理。

若一個顏色必選,當前連通塊中所有為該顏色的點都要選,一個點被選同時也意味着其到當前分治中心路徑上的點也都要選,不斷迭代得到當前分治中心的答案即可。

還有另一種做法:若顏色 \(i\) 形成的虛樹上有顏色為 \(j\) 的點,則 \(i\)\(j\) 連邊,意思為選了 \(i\) 則必選 \(j\)。對所有縮點后出度為 \(0\) 的點取 \(siz-1\) 的最小值即為答案。可以用樹剖線段樹來優化建圖。

「JOISC 2019 Day2」兩個天線

只用考慮 \(i<j,h_i>h_j\) 的情況,另一種情況取反后再做一遍即可。考慮掃描線,每個位置 \(i\) 維護其對應的 \(h_i-h_j\) 的最大值。

\(i\) 往后起作用的區間為 \([i+a_i,i+b_i]\),將其在相應的位置加入刪除即可,加入就是將維護的第一項賦值為 \(h_i\),刪除就是將其賦值為 \(-\infty\)

\(j\) 往前起作用的區間為 \([j-b_j,j-a_j]\),將這段區間的第二項和 \(-h_j\)\(\max\) 即可。

這些操作都可以在線段樹上來實現,就是單點修改和區間打標記。

「JOISC 2019 Day2」兩道料理

考慮暴力 \(DP\),設 \(f_{i,j}\) 為第一種到第 \(i\) 步,第二種到第 \(j\) 步的最大權值,復雜度為 \(O(nm)\),無法接受,考慮優化。

\(DP\) 放到網格圖上來考慮,從 \((0,0)\) 走到 \((n,m)\),轉移時權值的貢獻可以轉化為網格圖的點是否在路徑下方或路徑上,如果在,則加上對應的權值。

進一步觀察 \(DP\) 的過程,發現其從上一列轉移過來時,就是先對一些后綴加上一個權值,然后往前不斷取 \(\max\) 轉移過來。考慮對行差分,后綴加變成單點加,然后若一個位置為負數,則將其后面第一個非零位置加上這個數,然后將該位置清零,這樣就實現了取 \(\max\) 的過程。

\(set\) 維護非零位置,線段樹維護差分即可。

「JOISC 2020 Day3」星座 3

考慮從下往上掃描,對每個縱坐標維護出和該位置沖突且已經選了的星星的權值和。新加入一個星星時,比較刪除該星星和刪除和其沖突的星星權值,刪去權值更小的情況然后更新對應位置的權值即可。

用樹狀數組維護權值,實現區間加和單點查。發現向上掃描時還需知道每個縱坐標往左往右拓展最遠的位置,用兩個並查集維護即可。

還有一個笛卡爾樹的做法,建出笛卡爾樹后,星星等價於笛卡爾樹上的一條鏈,於是問題就轉化為了在樹上選出若干條不相交的鏈,使得權值和最大。\(DP\) 方式和 [NOI2020] 命運 類似,同樣也是線段樹合並實現整體 \(DP\)

「JOISC 2019 Day3」穿越時空 Bitaro

先將第 \(i\) 個城市的時間減去 \(i\),這樣走向下一個城市就不會流逝時間了,移動就是水平的了:

考慮用一些二元組 \((l,r)\) 和三元組 \((a,b,v)\),來描述經過一段城市的情況。

二元組 \((l,r)\) 表示進入這段城市的時刻在區間 \([l,r]\) 內時,通過這段城市不產生費用,二元組的合並就是取交,當不存在交集時就會產生三元組。

三元組 \((a,b,v)\) 表示進入這段城市的時刻至多為 \(a\),出去的時刻至少為 \(b\),費用為 \(v\)。二元組、三元組的合並是滿足結合律的,因此可以用線段樹來維護。

還有另一種維護分段函數的做法。對於一個城市,可以經過其的時刻為一個區間,因此出去時刻和費用都是關於進入時刻的一次函數,歸納發現對於一段城市,出去時刻和費用是關於進入時刻的三段分段函數。用線段樹來維護這個分段函數即可。

「JOISC 2019 Day4」蛋糕拼接 3

發現只要按 \(c\) 從小到大排序就能使 \(\sum\limits_{j=1}^m|c_{k_j}-c_{k_{j+1}}|\) 達到最小值 \(2(c_{\max}-c_{\min})\)

將蛋糕按 \(c\) 從小到大排序后,問題就轉化為了選出一個貢獻最大的區間 \([l,r]\),區間 \([l,r]\) 的貢獻為該區間最大的 \(m\)\(v\) 的和減去 \(2(c_r-c_l)\)

類似於 [IOI2014] holiday 假期,本題也是具有決策單調性的,對於每個 \(l\),最優的 \(r\) 是單調不降的。感性理解為什么有決策單調性就是因為新加入一個 \(r\) 后,對於 \(l_1<l_2\)\(l_2\) 獲得的貢獻是大於等於 \(l_1\) 的。

用分治求解最優決策點,主席樹求區間前 \(m\) 大的和即可。

「JOISC 2020 Day2」有趣的 Joitter 交友

將二元環縮為一個點集,發現點集都為團,且一個點向點集內任意一點連邊后,該點會向這個點集內所有點都連邊。並查集維護每個點所在的點集,\(set\) 維護每個點集內的點,出邊指向的點集,入邊所在的點集,入邊的起點,像 [WC2021] 括號路徑 一樣啟發式合並點集即可。

「JOISC 2020 Day4」治療計划

不用按時間順序來考慮區間,可以直接考慮區間間的兩兩合並,用 \(DP\) 來表示就是設 \(f_i\)\(t_i\) 時刻 \([1,r_i]\) 都已經被治愈的最小費用,\(i\) 能轉移到 \(j\) 當且僅當 \(r_i-l_j+1\geqslant |t_i-t_j|\)

發現轉移類似最短路,直接線段樹優化建圖跑最短路復雜度是 \(O(m\log^2 m)\) 的。

實際上有更優的做法:和 [NOI2019] 彈跳 一樣,可以不把邊建出來,先把絕對值去掉,得 \(r_i+1-t_i\geqslant l_j-t_j\)\(r_i+1-t_i\geqslant l_j+t_j\),用兩棵線段樹維護 \(l_i-t\)\(l_i+t_i\) 最小值。最短路過程中取出一個點 \(x\) 后,去兩棵線段樹上暴力找 \(x\) 能轉移到的點,轉移后把這些點的位置的權值設為 \(\infty\) 即可。因為費用為點權,所以每個點只會被松弛一次,得復雜度為 \(O(m\log m)\)

「JOISC 2018 Day 3」比太郎的聚會

注意到 \(\sum y_i\)\(n\) 同階,考慮根號分治。當 \(y_i\geqslant \sqrt n\) 時,這樣的詢問最多有 \(\sqrt n\) 個,暴力拓撲排序求最長路即可。當 \(y_i< \sqrt n\) 時,預處理每個點到達的最遠的 \(\sqrt n\) 個點,因為刪去的點 \(y_i< \sqrt n\),所以答案一定在預處理的點中產生,直接掃一遍預處理的點即可。

「JOISC 2019 Day3」指定城市

\(E_j=1\) 的情況可以通過換根 \(DP\) 求出,\(E_j=2\) 的情況選的兩個點一定是兩個葉子節點,在 \(lca\) 處統計貢獻即可。可以證明,對於 \(E_j>2\) 時,一定存在一種情況使得 \(E_j-1\) 的最優選擇點是 \(E_j\) 的最優選擇點的子集,也就是每次新增一個點。線段樹維護 \(dfs\) 序,每次加入收益最大的點,並把其貢獻刪除即可。

「JOISC 2020 Day1」掃除

先不考慮插入操作,向右掃和向上掃相當於對一個區間內的點橫坐標或縱坐標取 \(\max\)。若兩種操作都存在時,一種操作會影響另一種操作的有效范圍,如先向上掃后,向右掃能影響到的點的橫坐標的區間會縮小:

影響另一種操作的有效范圍也是一個區間取 \(\max\) 的操作,先按時間順序處理出每個操作的有效范圍,然后對橫縱坐標分開維護即可。

再考慮上插入操作,一個點可能中途加入,這樣就打破了原先點集階梯狀的分布了,但一個點從插入到查詢受到的操作是一個連續的區間,用線段樹分治來維護即可。用線段樹就能實現區間取 \(\max\),單點查詢。

「JOISC 2019 Day4」合並

一條邊兩側的子樹出現同種顏色后,這條邊就是合法的。將每種顏色的點形成的最小連通塊縮成一個點,這里可以用並查集來實現。然后整棵樹就都是由不同顏色的點構成的了,答案即為這棵樹的最小鏈覆蓋(用最少的鏈覆蓋所有邊),設葉子數為 \(cnt\),最小鏈覆蓋為 \(\left\lceil \frac{cnt}{2} \right\rceil\)

「JOISC 2017 Day 1」港口設施

考慮兩個物品,進出棧時間分別為 \(l_1,r_1\)\(l_2,r_2\),若有 \(l_1<l_2<r_1<r_2\),則這兩個物品一定在不同棧中。將形如這樣的物品間連一條邊,若形成的圖是二分圖則有合法方案,設連通塊個數為 \(cnt\),答案即為 \(2^{cnt}\)。直接連邊復雜度無法接受,發現一段區間都被連過邊后,之后往這個區間的連邊只需連一條邊來保證連通性,用並查集即可維護。

「JOISC 2017 Day 3」長途巴士

先對乘客按 \(D_i\) 排序,服務站按 \(S_i\bmod T\) 排序。

考慮對乘客進行 \(DP\),設 \(f_i\) 表示考慮了前 \(i\) 名乘客的最小花費,得轉移為:

\[\large f_i=\min \begin{cases} f_{i-1}+\left(\frac{X-D_i}{T}+1\right)W\\ f_j+(i-j)\left( \min\limits_{S_k\bmod T\in[D_i,D_{i+1})} \left\lfloor \frac{S_k}{T} \right\rfloor\right)W+\sum\limits_{k=j+1}^iC_k& j<i \end{cases} \]

第一個轉移就是保留乘客 \(i\) 到終點,第二個轉移是通過少買水,在第 \(k\) 個服務站將 \([j+1,i]\) 的乘客下車。

發現轉移是斜率優化的形式,但斜率不單調,用棧維護凸包后二分即可。


免責聲明!

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



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