动态开点线段树一定要访问再开,不访问千万别开,在pushup和merge的时候有可能会出现虚点错误转移的情况。
错误示范:
void update(int,p,int l,int r,intx,int k){
******
if(!lc[p]){
lc[p]=++cnt;
}
if(!rc[p]){
rc[p]=++cnt;
}
int mid=(l+r)>>1;
if(x<=mid){
update(lc[p],l,mid,x,k);
}else{
update(rc[p],mid+1,r,x,k);
}
******
}
正确示范:
void update(int p,int l,int r,int x,int k){
******
int mid=(l+r)>>1;
if(x<=mid){
if(!lc[p]){
lc[p]=++cnt;
}
update(lc[p],l,mid,x,k);
}else{
if(!rc[p]){
rc[p]=++cnt;
}
update(rc[p],mid+1,r,x,k);
}
******
}