洛谷#P13976普及/提高-
数列分块入门 1
#線段樹#樹狀陣列#分塊
0 views
第 1 / 3 章題目描述
處理一個長度為 的數列,支持兩種操作:
- 區間加法;
- 單點查詢。
若使用暴力,時間複雜度會逹到 ,無法通過 subtask 2,因此考慮使用分塊。
甚麼是分塊?
分块是將數組列分成若干個大小相近的塊,平衡時間複雜度。
如何分塊?
- 將長度為 的數組分成 個塊,每個塊的大小為 。
- 對每個塊,使用一個「懶標記」(類似線段樹)記錄該塊內所有元素需要累加的值,以避免每次更新時都遍歷塊內所有元素。
分塊的最佳大小
塊的大小是分塊算法的關鍵,直接影響時間複雜度。下面將分析為甚麼選擇 作為塊大小最好:
設塊的大小為 ,則總塊數為 。
對於區間操作,可以分成下列兩部分:
- 處理左右兩個的不完整塊,最多遍歷 個元素,時間複雜度是 。
- 處理中間的完整塊,最多遍歷 個塊,因為只需更新懶標記,所以時間複雜度是 。
即單次操作的總時間複雜度為 。
設 。
根據均值不等式 ,當且僅當 時等號成立。
因此,當塊大小為 時,單次操作的時間複雜度最佳,為 。對於 次操作,總時間複雜度為 。