可持久化平衡樹

2022-05-16 10:26:00 字數 1254 閱讀 9176

如題。

大家都知道,用權值線段樹可以過普通平衡樹那道題,那麼對於可持久化普通平衡樹,我們是否也可以用主席樹來搞一搞呢。答案是肯定的。只需要動態開點就行了。其他的跟普通平衡樹那道題一模一樣。

這裡需要注意一點,當 l 和 r 都是負數的時候, /2 就會有問題,因為 $ -5/2 = -2$ 而 $ -5 >> 1 = -3$ ,所以除2會使 l 一直小於mid,從而陷入死迴圈。

#include #define inf 2147483647

using namespace std;

template inline void read(t &x)

while(isdigit(c)) x*=k;

}const int maxn=5e5+5;

const int ll=-1e9,rr=1e9;

struct node t[maxn*40];

int root[maxn],sz;

void update(int l,int r,int pos,int val,int &x,int y)

int mid=(l+r)>>1;

if(pos<=mid) update(l,mid,pos,val,t[x].lc,t[y].lc);

else update(mid+1,r,pos,val,t[x].rc,t[y].rc);

t[x].sum=t[t[x].lc].sum+t[t[x].rc].sum;

}int query(int l,int r,int pos,int x)

int kth(int l,int r,int k,int x)

int pre(int l,int r,int pos,int x)

int query_muilt(int l,int r,int pos,int x)

int nxt(int l,int r,int pos,int x)

int n;

int main()

case 2 :

case 3 :

case 4 :

case 5 :

case 6 :

} }return 0;}/*

100 1 9

1 1 3

1 1 10

2 4 2

3 3 9

3 1 2

6 4 1

6 2 9

8 6 3

4 5 8

*/

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

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

rope(可持久化平衡樹)

include using namespace gnu cxx rope a,text test.push back x 在末尾新增x test.insert pos,x 在pos插入x test.erase pos,x 從pos開始刪除x個 test.copy pos,len,x 從pos開始到p...

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

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