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

2022-02-02 05:39:13 字數 794 閱讀 3308

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

做演算法題的一些想法

現在dp的難點在於,理解遞迴方程不難,但是如何據此設計出符合題意的正確的初始條件?不同的初始條件對應不同的問題。如01揹包中的是恰好裝滿揹包還是不超過揹包最大容量,可以通過初始化解決。自己在設計演算法的時候,如何設計出符合題意的初始條件和遞迴過程。這個過程全靠腦子復現一步一步的步驟是很慢的。因此,需...

對synchronized this 的一些理解

一 當兩個併發執行緒訪問同乙個物件object中的這個synchronized this 同步 塊時,乙個時間內只能有乙個執行緒得到執行。另乙個執行緒必須等待當前執行緒執行完這個 塊以後才能執行該 塊。二 然而,當乙個執行緒訪問object的乙個synchronized this 同步 塊時,另乙個...

對synchronized this 的一些理解

一 當兩個併發執行緒訪問同乙個物件object中的這個synchronized this 同步 塊時,乙個時間內只能有乙個執行緒得到執行。另乙個執行緒必須等待當前執行緒執行完這個 塊以後才能執行該 塊。二 然而,當乙個執行緒訪問object的乙個synchronized this 同步 塊時,另乙個...