類似靜態區間逆序對的題的一些做法


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


免責聲明!

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



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