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上最快。