【分塊】算法學習筆記


最近突發奇想,到B站上看qscqesze神犇的每周算法講堂,於是便學習了分塊這個算法。

分塊是一個很暴力的算法,按照某大神的說法,一般的區間問題都可以用他來解決,沒有100分也有80分(一般會有80分,運氣好有100分)。

分塊是一個很暴力的算法,它可以完成幾乎所有區間更新和區間查詢問題,但效率相對於線段樹等數據結構要差一些。

思想

對於一個長度為n的序列,我們可以講其中的元素分為M個連續的子序列,每塊的長度自然就為N/M。我們在更新一段區間[l,r]是,可以先更新l到l所在塊的右端點和r所在塊的右端點到r。即下圖中紅色的區域,每塊中最多有N/M個元素,所以這一操作的復雜度的為N/M。

然后我們在成段更新剛才更新的塊中間的那些塊(即上圖中紅色區域中間的那些塊),這些塊最多為N塊,所以這一操作的復雜度為M。

總操作的復雜度即為M+N/M,根據均值不等式可知,M=sqart(n)時復雜度最新。

建立分塊序列

block代表每一塊有多大,num代表一共有幾塊,belong【i】代表原序列中第i個元素在第幾塊,l[i]代表第i塊的左端點,r[i]代表第i塊的右端點。

具體怎么算我就不解釋了,自己根據代碼YY吧。

具體的查詢和更新操作就不張貼代碼了,因為這些因題目的要求而異。

 

最后附上 BZOJ 3343 /luogu 2801 教主的魔法的代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM