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