关于动态开点线段树与普通线段树修改函数的区别
  • 板块学术版
  • 楼主Coros_Trusds
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/1/26 16:53
  • 上次更新2023/10/28 10:52:06
查看原帖
关于动态开点线段树与普通线段树修改函数的区别
430409
Coros_Trusds楼主2022/1/26 16:53

动态开点:

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

2022/1/26 16:53
加载中...