回滾莫隊初步

2022-03-17 00:57:59 字數 2313 閱讀 4291

正常莫隊,時間複雜度的保證**於分塊和每次挪動指標的$o(1)$或$o(log)$的修改。

然而像可持續化並查集的思想一樣,在某些題中因為題目要求,導致並查集不能路徑壓縮,而要把時間版本存到棧,彈棧回溯時間版本。

有些題在適應題目中發現,只有擴充套件區間/縮小區間的時間複雜度***,那麼就輪到回滾莫隊解決問題。

實現流程及複雜度分析(那擴充套件區間為例):

1>左端點按塊,右端點按大小排序

2>列舉每乙個塊,統計左端點在這個塊裡的答案,具體分兩種情況:

$[1]$:右端點也在塊內,那麼直接暴掃,掃一次$o(\sqrt)$

$[2]$:右端點不在,i因為排序右端點遞增,所以維護乙個右端點指標,每次右端點增加,因為左端點無序,所以每次都把左端點的操作存到棧內,每次都清空,所有右端點移動$o(n)$,左端點移動一次$o(\sqrt)$

例題:permu

資料範圍較小,可以莫隊+線段樹水過

也可以在值域上維護鍊錶,發現每次擴充套件區間可以$o(1)$,縮小區間幾乎退化成暴力,應用回滾莫隊。

1 #include2 #include3 #include4 #include5 #include6

#define maxn 100010

7using

namespace

std;

8 inline int maxn(int a,int b)

9 inline int minn(int a,int b)

10 inline int

read()

16#define kd (read())

17int

n,m,a[maxn];

18int

lef[maxn],rig[maxn];

19int

bsize;

20 inline int blk(int

x)23

struct

node

29}q[maxn];

30int

zui[maxn];

31struct

rr;35 vectordd;

36int

tong[maxn];

37int

main()

63else

if(!tong[a[s]-1]&&!tong[a[s]+1

])67

else

if(tong[a[s]-1]&&!tong[a[s]+1

])72

else77}

78for(int s=q[pos].l;s<=q[pos].r;++s)tong[a[s]]=lef[a[s]]=rig[a[s]]=0

;79 ++pos;80}

81else

92else

if(!tong[a[r]-1]&&!tong[a[r]+1

])96

else

if(tong[a[r]-1]&&!tong[a[r]+1

])101

else

106}

107int l=i*bsize+1

;108

int tmp=lans;

109rr tt;

110while(l>q[pos].l)

123else

if(!tong[a[l]-1]&&!tong[a[l]+1

])129

else

if(tong[a[l]-1]&&!tong[a[l]+1

])137

else

145}

146 zui[q[pos].id]=lans;

147 lans=tmp;

148while(!dd.empty())

155else

if(tt.opt==2

)158

else

if(tt.opt==3

)162

else

166dd.pop_back();

167}

168 ++pos;

169}

170}

171for(int i=1;i<=n;++i)tong[a[i]]=lef[a[i]]=rig[a[i]]=0

;172

}173

for(int i=1;i<=m;++i)printf("

%d\n

",zui[i]);

174return0;

175 }

因為不想思考而分情況討論的大模擬碼量

CodeChef LNDNCK 回滾莫隊

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

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

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

bzoj4358 permu 回滾莫隊

序列上的問題?想到莫隊。然而這題像bzoj4241 歷史研究一樣毒瘤,資瓷o 1 o 1 o 1 加入,不資瓷o 1 o 1 o 1 刪除。安利一波題解 bzoj4241 歷史研究qwq 所以像4241一樣,需要用到回滾莫隊。這裡開兩個陣列l,r l,rl,r,l i l i l i 表示加入i時,...