c++分塊算法(暴力數據結構)
阿新 • • 發佈:2018-11-06
復雜度 spl nlogn 部分 基本 拓展 多說 操作 數據結構
快要noip了,該寫些題解攢攢rp了(逃)
看到題解裏那麽多線段樹啊,樹狀數組啊,本蒟蒻表示:這都是什麽鬼東西?
在所有高級數據結構中,樹狀數組是碼量最小的,跑的也基本是最快的,但理解很難,並且支持的操作很少;線段樹的碼量,相信寫過線段樹題的童鞋都親身體驗過這種恐怖(那些3min寫完splay的巨佬不要d我),理解雖然簡單,但一題調一輩子啊!
所以說到這裏,本蒟蒻想表達什麽呢?
分塊大法吼啊!
有人會說:分塊不是n√n的復雜度嗎?怎麽能跟nlogn的數據結構相提並論呢?或者說,分塊在聯賽中,有什麽優勢呢?
首先,雖然他復雜度高,但他能維護的東西多呀!(你看看n2的暴力什麽不能維護)
而且,因為有時線段樹有巨大的常數,反而比分塊跑的慢!(比如洛谷P2801)
再者說,如果聯賽一道題,好多方法都能做,你是用調一輩子的線段樹呢,還是十分暴力好寫的分塊呢?
廢話了這麽多,也是想讓大家知道,分塊也是一種很好的算法。
那分塊是怎麽實現的呢?顧名思義,分塊就是把一個區間分成好幾個小區間,至於是幾個呢,因題而異,但大部分題的復雜度都是n√n,所以默認是把區間分成√n塊。如果某題用分塊復雜度帶log,就讓塊分的更多一些,大概是乘個log(我也不知道為什麽)。
哪怎麽維護呢?當詢問某段區間時,把區間覆蓋的整塊打上一個tag標記,兩邊離散的塊呢,就暴力就好了。有人會說,這麽簡單?當然。(不簡單本蒟蒻怎麽可能會寫)
還有要註意的是詢問區間如果在一個塊裏要特判,所以要多大幾個if。(雖然有些麻煩,但都是板兒啊)
分塊大體差不多說完了,但這個算法十分靈活,準確的說,分塊這種思想十分可貴,能用到很多其他題上。
最後,如果想看分塊的板子和拓展,hzwer大佬博客裏有,可以去看一看(巨佬的碼風是真好看啊)!
謝謝大家!
c++分塊算法(暴力數據結構)