1. 程式人生 > >c++分塊演算法(暴力資料結構)

c++分塊演算法(暴力資料結構)

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

看到題解裡那麼多線段樹啊,樹狀陣列啊,本蒟蒻表示:這都是什麼鬼東西?

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

所以說到這裡,本蒟蒻想表達什麼呢?

分塊大法吼啊!

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

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

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

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

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

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

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

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

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

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

謝謝大家!