动态开点:
inline void update(int x,int y,int l,int r,int &p,int k)//[x,y] 为修改范围,[l,r] 为总的范围
{
if (!p) p = ++ tot;
if (x <=l & r <= y) {
Max[p] = max(Max[p],k);
return;
}
int mid = l + r >> 1;
if (x <= mid && l <= y) {
updata(x,y,l,mid,node[p].ls,k);
}
if (x <= r && y > mid) {
updata(x,y,mid + 1,r,node[p].rs,k);
}
}
普通线段树:
inline void update(int x,int y,int l,int r,int &p,int k)
{
if (x <=l & r <= y) {
Max[p] = max(Max[p],k);
return;
}
int mid = l + r >> 1;
if (x <= mid) {
updata(x,y,l,mid,node[p].ls,k);
}
if (y > mid) {
updata(x,y,mid + 1,r,node[p].rs,k);
}
}
为什么动态开点的修改函数改为:
inline void update(int x,int y,int l,int r,int &p,int k)//[x,y] 为修改范围,[l,r] 为总的范围
{
if (!p) p = ++ tot;
if (x <=l & r <= y) {
Max[p] = max(Max[p],k);
return;
}
int mid = l + r >> 1;
if (x <= mid) {
updata(x,y,l,mid,node[p].ls,k);
}
if (y > mid) {
updata(x,y,mid + 1,r,node[p].rs,k);
}
}
就会死循环?
为什么动态开点会走偏?
MnZn 刚学动态开点,求轻喷qwq