相似靜態區間逆序對的題的一些作法

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

相關文章
相關標籤/搜索