正常莫隊,時間複雜度的保證**於分塊和每次挪動指標的$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時,...