社区讨论

求问线段树

学术版参与者 6已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mih7lp1q
此快照首次捕获于
2025/11/27 17:06
3 个月前
此快照最后确认于
2025/11/27 23:06
3 个月前
查看原帖
板子打出来了,不太理解,问upd qry_sum qry_max函数中的 x,yx,y 含义。
CPP
void push_up(int rt)
{
	tree[rt].sum=tree[rt*2].sum+tree[rt*2+1].sum;
	tree[rt].maxi=max(tree[rt*2].maxi,tree[rt*2+1].maxi);
}
void upd(int rt,int x,int y)
{
	if (tree[rt].l==tree[rt].r)
	{
		tree[rt].sum+=y;
		tree[rt].maxi+=y;
		return ;
	}
	int mid=(tree[rt].l+tree[rt].r)/2;
	if (x<=mid)
		upd(rt*2,x,y);
	else
		upd(rt*2+1,x,y);
	push_up(rt);
}
void build(int rt,int l,int r)
{
	tree[rt].l=l;
	tree[rt].r=r;
	if (l==r)
	{
		tree[rt].sum=tree[rt].maxi=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(rt*2,l,mid);
	build(rt+1,mid+1,r);
	push_up(rt);
}
long long qry_sum(int rt,int x,int y)
{
	if (x<=tree[rt].l&&y>=tree[rt].r)
		return tree[rt].sum;
	int mid=(tree[rt].l+tree[rt].r)/2;
	long long ret=0;
	if (x<=mid)
		ret+=qry_sum(rt*2,x,y);
	if (y>mid)
		ret+=qry_sum(rt*2+1,x,y);
	return ret;
}
long long qry_max(int rt,int x,int y)
{
	if (x<=tree[rt].l&&y>=tree[rt].r)
		return tree[rt].max;
	int mid=(tree[rt].l+tree[rt].r)/2;
	long long ret=0;
	if (x<=mid)
		ret=max(ret,qry_max(rt*2,x,y));
	if (y>mid)
		ret=max(ret,qry_max(rt*2+1,x,y));
	return ret;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...