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

2022-09-15 00:42:27 字數 1302 閱讀 3566

p5906 【模板】回滾莫隊&不刪除莫隊

回滾莫隊是拿來幹什麼的呢?——在我們維護的資料不好刪除,但是可以撤銷,比較好新增的時候就可以使用回滾莫隊來維護。

(同樣反過來也是,但是好刪除不好新增應該很少見吧。/fad)

那麼具體怎麼做的呢?

首先認清楚裸回滾莫隊的效率:大常數 \(o(n\sqrt)\) ,就是跑滿了的 \(n\sqrt\) 。

然後看一下具體實現:

對於普通莫隊,我們在什麼情況下會有刪除?——右端點每次回到左邊或者左端點在塊內移動的時候。

那麼對於那個右端點我們可以怎麼處理讓他不刪除呢?很簡單,對於每乙個左端點的塊,我們都重新清空來做一遍莫隊即可,也就是重構。

那麼我們在什麼情況下還會有刪除?——在移動左端點的時候。(因為現在右端點只會不斷遞增了)

於是我們可以這樣考慮:在每次移動完當前的左端點過後,把它重新撤回到左端點在最右邊的狀態,那麼相當於我們每一次都是在從右往左走然後撤回回去右端,這樣做就沒有刪除了。

具體實現的話,我們可以對於區間在 \(\sqrt\) 內的直接暴力處理,然後對於剩下的再用我們上述方法處理。

時間複雜度是 \(o(n\sqrt)\) 的。

這道題就是回滾莫隊的板子題。

首先我們考慮怎麼維護這個資訊,我們可以維護當前區間的每乙個值的最左端和最右端,然後注意討論一下幾種情況就可以了。

**:

#includeusing namespace std;

template inline void read(t &x)ch=getchar();}

while(isdigit(ch))

x=f?-x:x;

return ;

}template inline void write(t x)

const int n=2e5+5;

#define ll long long

int n,m,k,a[n];

int ans[n],st[n],ed[n],b[n],cl,clear[n],bl[n],block,blo;

struct query

inline bool operator < (const query &b)const

ans[q[i].id]=now;

while(l<=r)

now=tmp;

} for(int k=1;k<=cl;k++) st[clear[k]]=ed[clear[k]]=0;

} for(int i=1;i<=m;i++) write(ans[i]),putchar('\n');

return 0;

}

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

莫隊好多套路啊。建議都學習一下 學習自題解 回滾莫隊的意思大概就是,按l所在塊再求列舉詢問,相同的一起求答案,l部分的必須每次從當前塊的最右邊向左拓展到想要的地方,求完當前詢問之後,你此時更新出的答案要回滾到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 的修改。然而像可持續化並查集的思想一樣,在某些題中因為題目要求,導致並查集不能路徑壓縮,而要把時間版本存到棧,彈棧回溯時間版本。有些題在適應題目中發現,只有擴充套件區間 縮小區間的時間複雜度 那麼就輪到回滾莫隊解決問題。實現...