推薦先閱讀:可持久化線段樹學習筆記
一、定義:
可進行修改,並支援如下兩功能的陣列:
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級...