資料結構 回滾莫隊淺記

2022-09-24 13:18:14 字數 1403 閱讀 5402

之前寫的普通莫隊筆記,在這裡當個前置知識,其實大約知道莫隊大概就是把詢問離線下來分塊並排序之後用兩個指標 \(l,r\) 來更新資訊統計答案即可。

有時在區間轉移的時候,有些刪除或新增的操作無法實現,那麼當只有一種操作不能實現的時候,就可以用莫隊來解決這個問題,然而普通莫隊是很難解決(或者說是不能解決)這個問題的,所以我們要對普通莫隊進行改造,也就是回滾莫隊。

本文出現所有**預設源使用v5.3.

給定乙個序列,多次詢問一段區間 \([l,r]\),求區間中相同的數的最遠間隔距離。

序列中兩個元素的間隔距離指的是兩個元素下標差的絕對值。

首先來說這個題有什麼操作不能實現。顯然增加是好實現的,只需要每次在增加時更新距離資訊(記錄第一次出現和最後一次出現)即可。但是刪除操作不能這樣實現,因為在刪除的時候若要更新答案,需要知道次大值……肯定是不能這樣維護的,所以我們要讓 \(l\) 和 \(r\) 在移動的過程中盡量避免刪除操作,也就是盡量讓 \(l\) 向左端移動,\(r\) 向右端移動。

那麼我們每次列舉塊,把塊內的詢問解決的時候,每次把 \(l\) 拉回當前塊的右端,然後保證 \(r\) 只向右端移動,\(l\) 不斷根據詢問反覆橫跳,對於在乙個塊內的詢問暴力更新(複雜度 \(o(\sqrt)\),不過可能實際略大),否則跳兩個指標更新答案。因為塊的是 \(o(\sqrt)\) 的,所以對於每個詢問,\(l\) 的移動是 \(o(\sqrt)\) 的,所以這樣做的複雜度就是 \(o(n\sqrt).\)

templatei j hmax(const j &x,const j &y) 

templatei j hmin(const j &x,const j &y)

ans[q[nw].id]=tmpans;

while(l<=rx)

tmpans=lsttmp;}}

for(int i(1);i<=apn;++i)

}for(int i(1);i<=qn;++i)

fw(ans[i],1);

heriko deltana;

}

給出長度為 \(n\) 的序列,\(q\) 次詢問,每次詢問區間 \([l,r]\) 中最大的重要度。

重要度的定義為當前事件的權值 \(x_i\) 乘上事件在區間**現次數 \(t_i.\)

和上個題一樣,這個題新增操作也是很好實現的,維護乙個桶即可,刪除操作一樣的不能實現,所以我們用同樣的策略。

templatei j hmax(const j &x,const j &y)

templatei j hmin(const j &x,const j &y) {

heriko xr)

add(++r);

ll lsttmp(tmpans);

while(q[nw].l終了。

CodeChef LNDNCK 回滾莫隊

鏈結 給你兩個陣列,b,p,陣列個數n 小於等於 2e5.m 個詢問,每次詢問 l r,把 區間 l,r 按照 b 的公升序排序,然後求和 abs p i p i 2 一開始的思路就是直接暴力莫隊,每次把 b 插入到map 裡面去,刪除也是直接從 map 裡面刪除。每次修改只會影響周圍的幾個值。但是...

回滾莫隊初步

正常莫隊,時間複雜度的保證 於分塊和每次挪動指標的 o 1 或 o log 的修改。然而像可持續化並查集的思想一樣,在某些題中因為題目要求,導致並查集不能路徑壓縮,而要把時間版本存到棧,彈棧回溯時間版本。有些題在適應題目中發現,只有擴充套件區間 縮小區間的時間複雜度 那麼就輪到回滾莫隊解決問題。實現...

P5906 模板 回滾莫隊 不刪除莫隊

p5906 模板 回滾莫隊 不刪除莫隊 回滾莫隊是拿來幹什麼的呢?在我們維護的資料不好刪除,但是可以撤銷,比較好新增的時候就可以使用回滾莫隊來維護。同樣反過來也是,但是好刪除不好新增應該很少見吧。fad 那麼具體怎麼做的呢?首先認清楚裸回滾莫隊的效率 大常數 o n sqrt 就是跑滿了的 n sq...