lxl說能發了,那就發吧
bzoj3289 / bzoj3744
離線做法
我會莫隊!拓展的時候用數據結構(樹狀數組)維護!O(nsqrt(n)logn)
我們考慮拓展的時候不插入,直接詢問當前區間的貢獻。
我們就是要靜態支持區間查詢<=x的有幾個。
考慮這種問題一般怎么做,我們對值域分塊,<=x就變成了一個塊前綴和一個塊內前綴。
我們有兩種做法,第一種是我們先跑一遍莫隊,找到我們需要哪些詢問。
然后我們差分一下,變成詢問前a個數<=x的有幾個,我們直接把這些詢問離線存下來值域分塊一下,掃一遍搞完了。O(nsqrt(n))
還有一種做法是直接把值域分塊可持久化,只要每次把修改的塊拷一遍存下塊下標就好了。這種做法可能會快一點,但是空間可能有點爆炸(O(nsqrt(n)))。
在線做法
我們考慮分塊!
除去邊界以外,一個詢問在分塊的眼中是這樣的:
零散|整塊|整塊|整塊|整塊|整塊|整塊|整塊|整塊|整塊|零散
我們來一塊一塊解決。
塊內的逆序對:預處理
塊間的逆序對:每塊排序完歸並
兩塊零散的逆序對:把這兩塊零散歸並
零散到整塊的逆序對:維護值域前綴和
零散內的逆序對:注意到零散的開頭或結尾一定是塊端點,預處理即可
那么邊界就是詢問端點在同一塊的,假設是[l,r],塊開頭為w,那么[l,r]的答案=[w,r]的答案-[w,l-1]的答案-[w,l-1]對[l,r]的貢獻,繼續歸並即可
O(nsqrt(n))
目前這個做法在3744上最快。