Codeforces Round 965 (Div. 2) 題解

definieren發表於2024-08-11

個人難度順序:A < D < B < C < E。

A. Find K Distinct Points with Fixed Center

如果 \(k\) 是偶數,構造 \((x_c + i, yc + i)\),其中 \(- \frac{k}{2} \le i \le \frac{k}{2}\)
對於 \(k\) 是奇數,先加一個點 \((xc, yc)\),然後就變成偶數的情況了。

B. Minimize Equal Sum Subarrays

先猜只有 \([1, n]\) 的和相等。
做字首和,問題就變成了 \(sump_{r} - sump_{l} \neq sumq_{r} - sumq_{l}\)
移項可得 \(sump_{r} - sumq_{r} \neq sump_{l} - sump_{l}\)
這就是在說,對於 \(i \neq n\)\(\Delta_i = sumq_i - sump_i\) 互不相等。

然後列舉構造方式,發現可以構造 \(q_i = p_i \bmod n + 1\)
不難發現,如果 \(p_i < n\),則 \(\Delta_i = \Delta_{i - 1} + 1\);如果 \(p_i = n\),則 \(\Delta_i = \Delta_{i - 1} - (n - 1)\)
觀察到只有 \(\Delta_0 = \Delta_n = 0\),所以這個構造是對的。

C. Perform Operations to Maximize Score

只會沒有腦子的做法。
首先發現,讓中位數增大的代價一定不比讓 \(a_i\) 增大的代價小。
所以說對於 \(b_i = 1\)\(i\),我們一定是讓 \(a_i\) 變為 \(a_i + k\),貢獻為 \(a_{i} + k + \operatorname{median}(c_i)\),刪掉一個數是 \(median\) 的排名變化是 \(O(1)\) 的,可以暴力。
對於 \(b_i = 0\)\(i\),我們要讓 \(\operatorname{median}(c_i)\) 儘可能大。

考慮如果只有一個 \(b_i = 0\)
求中位數我們會二分一個 \(mid\),將 \(a_i \le mid\) 的位置標記為 0,其餘位置標記為 1。
如果 0 的數量小於中位數的排名,就說明 \(\operatorname{median}(c_i) > mid\),所以我們的目標是讓 0 的數量儘可能少。
這一步可以貪心去做,就是將每個位置按從 0 變 1 的代價從小到大排序,然後從前往後取,知道代價大於 \(k\)
這樣就完成了 check,可以透過先從大到小排序將 check 最佳化到 \(O(n)\)

現在我們有很多個 \(b_i = 0\),考慮整體二分。
發現 \(b_i = 0\) 的位置並不能是 0 的個數改變,所以 check 和上面是一樣的。
然後就做完了。

時間複雜度 \(O(n \log V)\)

D. Determine Winning Islands in Race

如果 Elsie 能一步跨過 Bessie 走過的路,那麼他就贏了,也就是說只有額外邊能決定勝負。
所以先求出從 1 到每個點 \(u\) 的距離 \(dis_u\),然後列舉每條額外邊 \((u, v)\)
發現如果 \((u, v)\) 這條邊只能讓 Elsie 在 \((u, v - dis_u - 1)\) 這幾個點贏。
求答案的話就差分一下,時間複雜度 \(O(n)\)

E1. Eliminating Balls With Merging (Easy Version)

只會笨蛋做法。
首先你會暴力,就是列舉每個位置 \(i\),維護它能吸收的區間 \([l, r]\),然後 \(l\)\(r\) 分別往兩邊擴。
但你仔細想想,如果你跨過了一個原本不能跨過的位置,那麼 \(a_i\) 一定是翻倍的,所以只會擴充套件 \(O(\log V)\) 次,每次擴充套件可以透過 ST 表+二分實現。
時間複雜度 \(O(n \log n \log V)\)

E2. Eliminating Balls With Merging (Hard Version)

考慮在上一個題的基礎上分別求出 \(l\) 擴充套件到 1 時 \(r\) 能擴充套件的最大位置和最小位置,這樣做個字首和就好了。
時間複雜度 \(O(n \log n \log V)\)
P9530 [JOISC2022] 魚 2 的超級弱化版。

相關文章