1. 程式人生 > 其它 >Educational Codeforces Round 126 (Rated for Div. 2)

Educational Codeforces Round 126 (Rated for Div. 2)

比賽連結

A. Array Balancing

如果\(a_i > b_i\),那麼就對換,反之不對換。

B. Getting Zero

一開始寫遞迴發現死迴圈了,改成寫BFS就能過。

C. Water the Trees

最後的狀態會是所有元素都等於初始狀態所有元素中的最大值。

然後二分。

D. Progressions Covering

從後往前刪,每次讓最後一個\(a_i < b_i\)的位置的\(a_i\)\(k\),這樣會是最優的。

然後就是怎麼維護的問題了,假設當前位於\(i\),之前在位置\(j >= i\)操作了\(p_j\)次,\([i, i + k - 1]\)

內共操作了\(count\)次,這些操作對當前位置的影響為\(a_i = a_i +delta\),如果\(a_i < b_i\)\(i > k\),就讓\(a_i\)\(k\)一直加到\(a_i \ge b_i\)

位置\(i\)操作完了就移動到位置\(i - 1\),對於位置\(i - 1\)\([i, i + k - 1]\)所有操作的影響都減了\(1\),所以\(delta = delta - count\),然後\(p_{i + k -1}\)不再有影響,所以\(count = count - p_{i + k - 1}\)。重複上一個操作。

注意對於\(1 \le i \le k\)

,內的元素,此時可能還不滿足條件,這個時候只能令\(a_k\)去加\(k\),還需要的運算元很容易就能算。

E. Narrow Components

線段樹經典題型,比賽的時候想出來了,但是手殘半個小時沒調出來,主要是合併區間的操作沒寫好。

其實就是線段樹維護,每次合併左右兩個區間的時候,左區間的右邊界和右區間的左邊界可能會連通,從而減少連通塊的數量,所以左右區間合併的時候,先把兩個區間的答案加起來,再討論減少的情況。

有一個方法可以比較好的維護:對原本矩陣中的方格進行編號,然後對於每個區間維護3個值:區間答案\(ans\),3個左邊界編號\(lmask\),3個右邊界編號\(rmask\)。然後合併的時候就是並查集加邊,如果\(lmask_i\)

\(rmask_i\)都是有效的點,那麼他們之間可以加邊,如果成功加邊就會使連通塊數量減1。

F. Teleporters

TBA。