可持久化資料結構維護可持久化陣列

2022-04-30 19:18:12 字數 2270 閱讀 2298

首先我們要知道,"undo"操作,也就是直接跳回前面的操作(歷史操作),然後跳回的地方到現在的地方這乙個區間的操作都不用管。(這就是高階挑戰的思路)

(可持久化是指一種可以訪問歷史版本的資料結構)然後我們就可以知道,詢問歷史,又是陣列,也就是可持久化陣列。可持久化陣列的維護很簡單,我們可以開乙個\(o(n^2)\)的矩陣,然後進行操作。但是這樣子空間會**,怎麼辦?所以可持久化陣列又可以用可持久化線段樹來維護,雖然有很多空間浪費了,不過空間也還是\(o(n\ log\ n)\)(因為每乙個數帶來的空間是\(log\ n\)的)。

所以就這樣子咯,如果還不會可持久化線段樹(主席樹)的可以去做洛谷的模板。

// luogu-judger-enable-o2

var n,cnt,hao,tot:longint;

len,lson,rson,root:array[0..2000035] of longint;

value:array[0..2000035] of char;

s:string;

huha:char;

procedure build(var rt:longint; fa,l,r,po:longint); //插入乙個數

var mid:longint;

begin

if (rt=0) then

begin

inc(tot);

rt:=tot; //動態開點

end;

if l=r then //到了葉子節點

begin

value[rt]:=huha; //賦值

exit; //退出

end;

mid:=(l+r) div 2;

if (po<=mid) then //po就是key位置,我現在在最後(乙個棧)插入乙個數,po就是最後的位置

begin

rson[rt]:=rson[fa]; //垃圾**

build(lson[rt],lson[fa],l,mid,po); //左走

end;

if (po>=mid+1) then //同上

begin

lson[rt]:=lson[fa];

build(rson[rt],rson[fa],mid+1,r,po);

end;

end;

function query(rt,l,r,po:longint):char; //查詢

var mid:longint;

begin

if l=r then //到了指定位置(不一定是po)

exit(value[rt]);

mid:=(l+r) div 2; // 線段樹常識

if (po<=mid) then

exit(query(lson[rt],l,mid,po));

if (po>=mid+1) then

exit(query(rson[rt],mid+1,r,po));

end;

begin

readln(n);

while n>0 do

begin

readln(s);

if s[1]='t' then

begin

huha:=s[3]; //直接擷取

inc(cnt);

len[cnt]:=len[cnt-1]+1; //新的位置

build(root[cnt],root[cnt-1],1,100007,len[cnt]); //插入

end;

if s[1]='u' then

begin

delete(s,1,2);

val(s,hao);

inc(cnt);

len[cnt]:=len[cnt-hao-1]; //位置往前推

root[cnt]:=root[cnt-hao-1]; //root往前推(沒乙個數都有乙個log鏈,當然有乙個根)

end;

if s[1]='q' then

begin

delete(s,1,2);

val(s,hao);

writeln(query(root[cnt],1,100007,hao)); // 查詢,我們不知道最長的長度是多少,所以就100007就可以了,log不會超過20

end;

dec(n);

end;

end.

可持久化資料結構

1.可持久化線段樹 可持久化陣列 最基礎的可持久化資料結構,每次修改開新的log個點即可。includeusing namespace std const int n 1e6 100 templatevoid rd t x templatevoid print t x struct segseg n...

可持久化資料結構

用vector實現可持久化 這題要求的是乙個支援區間查詢的可持久化資料結構。這裡使用vector巧妙地實現 pair用pair儲存時間戳以及當前時間的值,query的時候使用二分查詢即可。如下 1 include2 include3 include4 include5 define x first ...

可持久化 可持久化資料結構學習筆記

我終於也要學可持久化了qwq 膜wjmzbmr 線 割 分 是 我 資料結構的可持久化,就是把乙個資料結構的歷史狀態全都儲存下來,從而能夠快速查詢之前出現過的某個操作的結果。當然這必然會帶來很大的時間和空間消耗,因此優越的可持久化都會充分利用資料結構歷史狀態裡的相似部分來減少時間和空間複雜度。顯然有...