2020.10.18-16:34可持久化這個東西啊,簡單的來說就是增加題目難度通過奇妙的方式新建結點來儲存之前的資訊,以達到回退的目的
陣列是我們經常接觸的東西
但是一可持久化就成藍題了
這其實相當於單點修改單點查詢的主席樹
我們會發現一次操作最多更新 \(\lg n\) 個節點
於是我們把這 \(\lg n\) 個節點存一下即可
那麼怎麼存呢?
對於update(change)在每層遞迴的時候新建結點就可以
對於query直接複製
最後把根節點存一下即可
【**實現】
#include#define fx(l,n) inline l n
#define n 14000001
using namespace std;
int v[n],n,m,ver,op,loc,val,root[n],node=1;
struct ptt[n];
fx(void,build)(int p,int l,int r)
int mid=(l+r)>>1;
t[p].l=++node;
build(t[p].l,l,mid);
t[p].r=++node;
build(t[p].r,mid+1,r);
}fx(int,newnd)(int p)
fx(int,change)(int p,int l,int r,int pl,int v) else
return p;
}fx(int,query)(int p,int l,int r,int pl) else
}signed main() else
}}
可持久化資料結構
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 ...
可持久化資料結構維護可持久化陣列
首先我們要知道,undo 操作,也就是直接跳回前面的操作 歷史操作 然後跳回的地方到現在的地方這乙個區間的操作都不用管。這就是高階挑戰的思路 可持久化是指一種可以訪問歷史版本的資料結構 然後我們就可以知道,詢問歷史,又是陣列,也就是可持久化陣列。可持久化陣列的維護很簡單,我們可以開乙個 o n 2 ...