可持久化陣列學習筆記

2022-05-16 11:10:19 字數 955 閱讀 8367

推薦先閱讀:可持久化線段樹學習筆記

一、定義:

可進行修改,並支援如下兩功能的陣列:

1.在某個歷史版本上修改某乙個位置上的值

2.訪問某個歷史版本上的某一位置的值

二、原理:

如果你已經學會了可持久化線段樹(我就當你會了,不會見題頭),會發現其實可持久化陣列已經*含在**樹中,或者說借**樹實現的

建樹與修改操作與**樹完全相同:通過共享節點最小化空間

查詢時直接在目標版本中查詢即可

完整**:

#include#include

#define maxn 200010

#define mid (l+r)/2

using

namespace

std;

struct

node

tree[

20000010

];int root[maxn<<5

];int a[maxn<<5

],n,m,cc;

intcnt;

void build(int l,int r,int &rt)

build(l,mid,tree[rt].l);

build(mid+1

,r,tree[rt].r);

}void update(int num,int &rt,int l,int

r)

if(num<=mid)

update(num,tree[rt].l,l,mid);

else

update(num,tree[rt].r,mid+1

,r);

}int query(int rt,int l,int r,int

num)

intmain()

if(ty==2

)

}return0;

}

可持久化陣列

日常不想放題目 luogu p3919 模板 可持久化陣列 題目中要求可以查詢歷史狀態,最暴力的想法是開 a m n 的二維陣列,每次修改暴力複製並修改,每次查詢暴力掃瞄,時間複雜度是 o m n 的,但這顯然是不行的.這個時候其實很容易想到線段樹,但線段樹維護的是當前狀態而無法維護歷史狀態,一種暴...

可持久化陣列

update 最後乙個點時間空間已經放大 標題即題意 有了可持久化陣列,便可以實現很多衍生的可持久化功能 例如 可持久化並查集 如題,你需要維護這樣的乙個長度為 nn 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操作2,...

可持久化fhq treap學習筆記

目錄luogu扣圖 由於fhq treap是沒有旋轉操作的 所以每次操作後的其它沒有操作的節點間的關係不變 而有旋轉平衡樹是要改變的,所以就不大能進行可持久化了 回想,主席樹的方法 每次用log的記憶體記錄一次操作 這可持久平衡樹也一樣 每次merge或者split都新開節點記錄路徑 路徑是log級...