模板 可持久化陣列(可持久化線段樹 平衡樹)

2022-05-01 05:27:13 字數 2157 閱讀 8474

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 vi​1loci​valuei​,即為在版本vi v_i vi​的基礎上,將 aloci a__i} aloci​​修改為 valuei _i valuei​

對於操作2,格式為vi 2 loci v_i \ 2 \ _i vi​2loci​,即訪問版本vi v_i vi​中的 aloci a__i} aloci​​的值

輸出格式:

輸出包含若干行,依次為每個操作2的結果。

輸入樣例#1:複製

5 10

59 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:複製

59

8741

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 #include2

const

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版本的這...