社区讨论
求问线段树
学术版参与者 6已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mih7lp1q
- 此快照首次捕获于
- 2025/11/27 17:06 3 个月前
- 此快照最后确认于
- 2025/11/27 23:06 3 个月前
板子打出来了,不太理解,问
CPPupd qry_sum qry_max函数中的 含义。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 条回复,欢迎继续交流。
正在加载回复...