1. 程式人生 > 其它 >二次離線莫隊

二次離線莫隊

莫隊的二次離線說難也難,說簡單也簡單,主要是看你對莫隊的理解是否深刻。
這個演算法說白了,就是把複雜度拆開,比如一個你莫隊的時候一次移動複雜度是 \(O(\log n)\),那麼整體的複雜度就是 \(O(n\sqrt n\log n)\),導致無法通過。
但是莫隊雖然是一個離線演算法,但是它的左右端點移動造成的貢獻差的計算卻是線上的,我們可以把這個線上的東西再次離線下來計算,對複雜度進行進一步的優化。

先來一個例題
對於這題,我們如果莫隊之後暴力計算貢獻(使用樹狀陣列)的複雜度是 \(O(n\sqrt n\log n)\) 的。
但是我們可以發現,每次移動右端點時,左端點總是不變的,所以我們可以通俗的寫成 \(f(x,l,r)\)

是左端點是 \(x\),右端點從 \(l-1\) 變到 \(r\) 所造成的貢獻,然後我們可以根據之前的式子推一下。
\(g(x,y)\) 表示右端點從 \(y-1\) 變成 \(y\) 造成的貢獻,那麼 \(f(x,l,r)=\sum_{i=l}^r g(x,i)\),然後我們對於 \(x\) 排個序之後值域分塊,就可以做到 \(O(\sqrt n)\) 計算貢獻。
而固定右端點移動左端點的時候同理。