[學習筆記]二進制分組


說起來還是很簡單的,就是分塊暴力重構的思想

二進制分組就是把操作的數量二進制拆分,每個二進制位數用數據結構維護

合並的時候,暴力重構

每次查詢,從logn個塊依次用維護的數據結構查詢

例如有23=16+4+2+1,再加一個操作,就合並成:24=16+8

查詢的復雜度是logn*(每一塊)logn其實是二進制下1的個數,比較虛。

暴力重構,如果重構的復雜度都是O(元素個數)的話,O(nlogn)

形象化理解,就是線段樹從葉子開始建,兒子建滿了就merge上去

 

一些操作因題而異,但是都是維護操作序列的感覺:
1.每次只是對前綴操作序列查詢,重建之后還可以刪除兩個兒子

2.對操作序列的某個區間查詢,線段樹一樣構造+查詢即可

3.支持棧序刪除操作,類似分塊的刪除,懶惰,如果湊成了1 1 1 1 ,才合並2 1 1,湊出2 2 2 2才合並4 2 2,這樣,重構的元素大小和要再次刪除次數級別相等。就是常數大。

 

畢竟屬於可以暴力重構的東西,對於每組的數據結構靈活性要求就不高了,甚至不用隨機插入

而且這玩意在線算法

 

 例題:

bzoj2989&&4170數列——二進制分組+主席樹

主席樹眾所周知難以隨機插入,但是配合上二進制分組,暴力重構就解決了問題

CF710F String Set Queries

 

體現了強制在線下二進制分組的好處,cdq雖然在操作序列的時間上可以降維打擊,變成先插入刪除再查詢,但是畢竟只是離線算法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM