c++分塊算法(暴力數據結構)


快要noip了,該寫些題解攢攢rp了(

看到題解里那么多線段樹啊,樹狀數組啊,本蒟蒻表示:這都是什么鬼東西?

在所有高級數據結構中,樹狀數組是碼量最小的,跑的也基本是最快的,但理解很難,並且支持的操作很少;線段樹的碼量,相信寫過線段樹題的童鞋都親身體驗過這種恐怖(那些3min寫完splay的巨佬不要d我),理解雖然簡單,但一題調一輩子啊!

所以說到這里,本蒟蒻想表達什么呢?

分塊大法吼啊!

有人會說:分塊不是n√n的復雜度嗎?怎么能跟nlogn的數據結構相提並論呢?或者說,分塊在聯賽中,有什么優勢呢?

首先,雖然他復雜度高,但他能維護的東西多呀!(你看看n²的暴力什么不能維護)

而且,因為有時線段樹有巨大的常數,反而比分塊跑的慢!(比如洛谷P2801)

再者說,如果聯賽一道題,好多方法都能做,你是用調一輩子的線段樹呢,還是十分暴力好寫的分塊呢?

廢話了這么多,也是想讓大家知道,分塊也是一種很好的算法。

那分塊是怎么實現的呢?顧名思義,分塊就是把一個區間分成好幾個小區間,至於是幾個呢,因題而異,但大部分題的復雜度都是n√n,所以默認是把區間分成√n塊。如果某題用分塊復雜度帶log,就讓塊分的更多一些,大概是乘個log(我也不知道為什么)。

哪怎么維護呢?當詢問某段區間時,把區間覆蓋的整塊打上一個tag標記,兩邊離散的塊呢,就暴力就好了。有人會說,這么簡單?當然。(不簡單本蒟蒻怎么可能會寫)

還有要注意的是詢問區間如果在一個塊里要特判,所以要多大幾個if。(雖然有些麻煩,但都是板兒啊)

分塊大體差不多說完了,但這個算法十分靈活,准確的說,分塊這種思想十分可貴,能用到很多其他題上。

最后,如果想看分塊的板子和拓展,hzwer大佬博客里有,可以去看一看(巨佬的碼風是真好看啊)!

謝謝大家!


免責聲明!

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



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