AtCoder 🟡 ABC434D Clouds
題目的難度顏色使用 Luogu 上的分級,由簡單到困難分別為 🔴🟠🟡🟢🔵🟣⚫。
🔗 🟡 ABC434D Clouds
Problem Statement
題目簡述
在一個 的網格中有 朵雲,每朵雲覆蓋一個矩形區域 列以及 行。
對於每一朵雲,求若「僅移除這朵雲」後,網格中完全沒被任何雲覆蓋的格子總數。
Constraints
約束條件
思路:二維差分與二維前綴和
這是一道涉及二維空間覆蓋計數的經典題型。由於網格大小僅有 ,我們可以承受 的時間與空間複雜度。
1. 問題分析
如果不移除任何雲,我們可以算出目前網格的覆蓋狀況。當我們試圖移除第 朵雲時:
- 如果某個被第 朵雲覆蓋的格子,同時也被其他雲覆蓋(即覆蓋次數 ),那移除雲 後,這個格子依然有雲遮蔽。
- 如果某個格子只被第 朵雲覆蓋(即覆蓋次數 ),那麼移除雲 後,這個格子就會變成無雲遮蔽的狀態。
因此,對於每一朵雲,移除它後真正增加的「無雲遮蔽格子數」,就是這朵雲覆蓋範圍內「恰好被覆蓋一次的格子數」。
核心轉換
移除雲 後的空白格子總數 = (原先本來就不在任何雲底下的空白格子數)+(雲 範圍內,恰被覆蓋 1 次的格子數)
2. 實作步驟
要高效查詢任意矩形區域內「恰好覆蓋 次」的格子數,我們需要進行前置處理:
- 二維差分計算覆蓋次數
- 由於有 次區間覆蓋操作,暴力覆蓋會導致超時。
- 利用二維差分(2D Difference Array),可以在 時間內標記矩形區間的加減操作。
- 遍歷完所有雲的範圍之後,對差分陣列做一次二維前綴和,即可計算出每個格子真實的被覆蓋次數。
- 統計初始空白格子數
- 掃描還原後的覆蓋次數網格,計算覆蓋次數為 的格子總數,將此數值標記為基準的空白格子數並記錄下來。
- 對覆蓋次數為 1 的格子做二維前綴和快速查詢
- 建立一個新的標記網格,記錄每個格子是不是「恰被覆蓋 次」(若是則標記為 ,否則為 )。
- 對這份由 和 構成的標記網格進行二維前綴和(2D Prefix Sum)。
- 計算答案
- 對於每一朵雲,利用已經建立好的前綴和標記網格,可以在 的時間內算出其原始覆蓋範圍內包含的「恰被覆蓋 次格子總和」。
- 將該總和加上最初記錄的基準空白格子數,即為移除這朵雲後,網格中真正的空白格子總數。
複雜度分析
- 時間複雜度:
- 空間複雜度:。
Code
1 | H = W = 2000 |
寫在最後
Cover Image Credit
The cover image was created by @floomf. All rights belong to the original artist.
It is used here only as a non-commercial cover illustration for this note. I do not claim ownership of the artwork.
If you are the copyright holder and believe this usage is inappropriate, please contact me by email or leave a comment. I will remove the image promptly.
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 十六個天亮!
評論
WalineGiscus






