1. 程式人生 > >c++分塊算法(暴力數據結構)

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

復雜度 spl nlogn 部分 基本 拓展 多說 操作 數據結構

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

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

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

所以說到這裏,本蒟蒻想表達什麽呢?

分塊大法吼啊!

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

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

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

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

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

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

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

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

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

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

謝謝大家!

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