块状数组
例題
本沙茶覺得塊狀數組又好寫又有用(其實就是另一種樸素)……只是那個O(sqrt(n))的復雜度比較大而已(其實如果加上常數的話它并不比Segplaytree慢多少)
編程技巧:
(1)每塊長度設為m=floor(sqrt(n)),最后不足長度的不補值,設n0為總塊數(顯然n0=(n-1)/m+1);
(2)設立LEN[i]=第i塊的實際長度(顯然除了最后一塊都是m),可以在建立塊狀數組(真正搞成塊狀,也就是二維)的時候得到;
(3)對于區(qū)間[l, r],要注意:<1>l、r位于同一塊(l/m==r/m)的情況;<2>r位于最后一塊的情況;
(4)別忘了同時更新原數組與塊狀數組;
另外,本例題需要二分+找多少個比它小的這樣的操作,總時間復雜度是O(N*sqrt(N)*log 2N*log 2N)(幸虧N只有10000……)。
本沙茶覺得塊狀數組又好寫又有用(其實就是另一種樸素)……只是那個O(sqrt(n))的復雜度比較大而已(其實如果加上常數的話它并不比Segplaytree慢多少)
編程技巧:
(1)每塊長度設為m=floor(sqrt(n)),最后不足長度的不補值,設n0為總塊數(顯然n0=(n-1)/m+1);
(2)設立LEN[i]=第i塊的實際長度(顯然除了最后一塊都是m),可以在建立塊狀數組(真正搞成塊狀,也就是二維)的時候得到;
(3)對于區(qū)間[l, r],要注意:<1>l、r位于同一塊(l/m==r/m)的情況;<2>r位于最后一塊的情況;
(4)別忘了同時更新原數組與塊狀數組;
另外,本例題需要二分+找多少個比它小的這樣的操作,總時間復雜度是O(N*sqrt(N)*log 2N*log 2N)(幸虧N只有10000……)。
如果有插入刪除元素,就需要用動態(tài)的塊狀鏈表了……極其難搞,本沙茶不敢試了……遇到這種題還是寫Segplaytree吧囧……
總結
- 上一篇: 【块状树】
- 下一篇: 结构之美——优先队列基本结构(四)——二