CF 1253 題解

snowycat1234發表於2024-11-19

CF 1253 題解

A Single Push

考慮令 \(d_i=b_i-a_i\), 那麼合法當且僅當 \(d\) 在一個字首和一個字尾都是 \(0\), 其餘地方值一致並且非負.

B Silly Mistake

注意到能作一次劃分的時候立即劃分一定更優, 因為這樣就不會因為潛在的一天兩次進入辦公室而得不到答案.

貪心的模擬即可.

C Sweets Eating

首先把 \(a\) 降序排列, 用手去玩前幾個值, 注意找遞推關係: (令 \(k = 2\))

\[\begin{align*} &f_1 = a_1 \\ &f_2 = a_2 + a_1\\ &f_3 = a_3 + a_2 + 2a_1 \\ &f_4 = a_4 + a_3 + 2a_2 + 2a_1 \\ &f_5 = a_5 + a_4 + 2a_3 + 2a_2 + 3a_1 \\ &\ldots \end{align*} \]

觀察得 \(f_i=sum_i+f_{i-k}\), 遞推即可.

D Harmonious Graph

考慮一個邊 \(l\rightarrow r\), 那麼意味著 \(l\)\(r\) 這個區間都聯通. 維護這樣的連通性只需要並查集, 順便用並查集跳過已經合併的位置, 那麼暴力做就是對的.

需要新增的邊就是目前的連通塊數減掉最終連通塊數, 證明考慮每一條邊合併兩個連通塊.

E Antenna Coverage

注意到 \(n\) 比較小, 那麼考慮一個 \(O(nm)\) 的 dp, 設 \(f_i\) 表示用第 \(i\) 格之前的信標去覆蓋前 \(i\) 個位置的最小代價, 列舉覆蓋第 \(i\) 格所用的信標 \(j\), 計算剛好覆蓋 \(i\) 時該信標所覆蓋的左端點 \(l\), 然後轉移 \(f_i\leftarrow cst+\min_{l\leq j<i}f_j\), 後半部分在單調棧上二分即可.

問題是最後面的信標可能在右側覆蓋範圍超出了 \(m\), 但是注意到它一定不會超過 \(2m\), 那麼計算到 \(2m\) 即可.

F Cheap Robot

這道題是很牛的. 首先考慮求出來每個點離它最近的充電站的距離 \(dis_i\), 以及該充電站編號 \(near_i\). 暴力做直接炸了, 但是考慮多源 dij 就可以了.

考慮列列式子, 對於一條邊 \(u\rightarrow v : w\), 設經過 \(i\) 時電量為 \(c_i\), 答案為 \(x\), 由於任意充電樁到達它都需要 \(dis_i\) 代價, 而它到達任意充電樁都需要 \(dis_i\) 代價, 因此有:

\[dis_i \leq c_i\leq x-dis_i \]

我們不妨認為機器人從 \(u\) 走到了 \(v\), 那麼:

\[dis_u\leq c_u \leq x-dis_u \\ dis_v\leq c_u-w \leq x - dis_v \]

那麼不難發現:

\[x-dis_v\geq c_u - w \geq dis_u - w \]

移項, 得:

\[x \geq dis_u + dis_v + w \]

我們現在有答案的一個下界, 考慮現在有路徑 \(P:u\rightarrow v\), 而現在令答案是 \(\max_{(u,v):w\in P}(dis_u + dis_v + w)\), 是否存在合法路徑呢? 存在的, 設路徑表示為 \(p_1\rightarrow p_2\rightarrow p_3\rightarrow \ldots\rightarrow p_{k-1}\rightarrow p_k\), 那麼我有足夠的電量從 \(p_1\) 走到 \(near_{p_2}\), 再從 \(near_{p_2}\) 走到 \(near_{p_3}\), 以此類推即可.

因此把每條邊重新賦邊權, 然後建立最小生成樹, 倍增求鏈上最大值即可.