說起來還是很簡單的,就是分塊暴力重構的思想
二進制分組就是把操作的數量二進制拆分,每個二進制位數用數據結構維護
合並的時候,暴力重構
每次查詢,從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,這樣,重構的元素大小和要再次刪除次數級別相等。就是常數大。
畢竟屬於可以暴力重構的東西,對於每組的數據結構靈活性要求就不高了,甚至不用隨機插入
而且這玩意在線算法
例題:
主席樹眾所周知難以隨機插入,但是配合上二進制分組,暴力重構就解決了問題
體現了強制在線下二進制分組的好處,cdq雖然在操作序列的時間上可以降維打擊,變成先插入刪除再查詢,但是畢竟只是離線算法