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 同步 塊時,另乙個...