update : 最後乙個點時間空間已經放大
標題即題意
有了可持久化陣列,便可以實現很多衍生的可持久化功能(例如:可持久化並查集)
如題,你需要維護這樣的乙個長度為 n n n 的陣列,支援如下幾種操作
在某個歷史版本上修改某乙個位置上的值
訪問某個歷史版本上的某一位置的值
此外,每進行一次操作(對於操作2,即為生成乙個完全一樣的版本,不作任何改動),就會生成乙個新的版本。版本編號即為當前操作的編號(從1開始編號,版本0表示初始狀態陣列)
輸入格式:
輸入的第一行包含兩個正整數 n,m n, m n,m, 分別表示陣列的長度和操作的個數。
第二行包含n n n個整數,依次為初始狀態下陣列各位的值(依次為 ai a_i ai,1≤i≤n 1 \leq i \leq n 1≤i≤n)。
接下來m m m行每行包含3或4個整數,代表兩種操作之一(i i i為基於的歷史版本號):
對於操作1,格式為vi 1 loci valuei v_i \ 1 \ _i \ _i vi1locivaluei,即為在版本vi v_i vi的基礎上,將 aloci a__i} aloci修改為 valuei _i valuei
對於操作2,格式為vi 2 loci v_i \ 2 \ _i vi2loci,即訪問版本vi v_i vi中的 aloci a__i} aloci的值
輸出格式:
輸出包含若干行,依次為每個操作2的結果。
輸入樣例#1:複製
5 1059 46 14 87 41
0 2 1
0 1 1 14
0 1 1 57
0 1 1 88
4 2 4
0 2 5
0 2 4
4 2 1
2 2 2
1 1 5 91
輸出樣例#1:複製
598741
8788
46
資料規模:
對於30%的資料:1≤n,m≤103 1 \leq n, m \leq ^3 1≤n,m≤103
對於50%的資料:1≤n,m≤104 1 \leq n, m \leq ^4 1≤n,m≤104
對於70%的資料:1≤n,m≤105 1 \leq n, m \leq ^5 1≤n,m≤105
對於100%的資料:1≤n,m≤106,1≤loci≤n,0≤vi1≤n,m≤106,1≤loci≤n,0≤vi經測試,正常常數的可持久化陣列可以通過,請各位放心
資料略微**,請注意常數不要過大
另,此題i/o量較大,如果實在tle請注意i/o優化
樣例說明:
一共11個版本,編號從0-10,依次為:
其實就是寫個可持久化線段樹就行了;
會了可持久化陣列,就可以進行可持久化並查集的操作了quq
1 #include2const
int maxn=1e6+10;3
intn,m;
4int
rt[maxn],ts;
5int t[maxn<<4],ls[maxn<<4],rs[maxn<<4];6
void build(int&k,int l,int
r)12
int mid=l+r>>1;13
build(ls[k],l,mid);
14 build(rs[k],mid+1
,r);15}
16void change(int q,int&p,int l,int r,int
x)22
int mid=l+r>>1;23
if(x<=mid) change(ls[q],ls[p],l,mid,x),rs[p]=rs[q];
24else change(rs[q],rs[p],mid+1,r,x),ls[p]=ls[q];25}
26int search(int p,int l,int r,int
x)32
intmain()
41return0;
42 }
可持久化陣列(可持久化線段樹 平衡樹)
update 最後乙個點時間空間已經放大 標題即題意 有了可持久化陣列,便可以實現很多衍生的可持久化功能 例如 可持久化並查集 如題,你需要維護這樣的乙個長度為 n n n 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操...
模板 可持久化線段樹
大神講解下終於理解了可持久化和區間第 k大數的關係。終於理解了權值線段樹是什麼。權值線段樹 例 1 1 2 7 9 11 一串數列,權值線段樹里的 線段 指 有序數列 裡的 一段區間 一般統計的是 乙個數 乙個區間裡的數 的出現次數。以一次插入為乙個歷史狀態 應用線段樹的結構穩定性 建好後結構不變。...
可持久化線段樹(主席樹)及可持久化陣列
定義 可以訪問歷史版本的線段樹為可持久化線段樹 可持久化線段樹之所以可以訪問歷史版本,是因為巨集觀上看,它為每個版本維護了一棵樹。當然,如果真的對每個版本建一顆樹,時間空間複雜度都hold不住。所以建立i版本的樹時,如果某顆子樹相對於i 1版本沒有變化,就可以直接使其父親對應的指標指向i 1版本的這...