如題。
大家都知道,用權值線段樹可以過普通平衡樹那道題,那麼對於可持久化普通平衡樹,我們是否也可以用主席樹來搞一搞呢。答案是肯定的。只需要動態開點就行了。其他的跟普通平衡樹那道題一模一樣。
這裡需要注意一點,當 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 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操...