一些问题
查看原帖
一些问题
1245780
luobotianle楼主2024/5/4 11:42

为什么合并线段树的 query 函数的递归部分要写成这样:

int res=0;
if(L<=mid)res+=query(t[k].lc,l,mid,L,R);
if(R>mid)res+=query(t[k].rc,mid+1,r,L,R);
return res;

而写成这样会死循环而 T 掉:

if(R<=mid)return query(t[k].lc,l,mid,L,R);
else if(L>mid)return query(t[k].rc,mid+1,r,L,R);
else return query(t[k].lc,l,mid,L,R)+query(t[k].rc,mid+1,r,L,R);

但是如果 R<=mid 这里不判等,写成 R<mid 就能过,就像这样:

if(R<mid)return query(t[k].lc,l,mid,L,R);
else if(L>mid)return query(t[k].rc,mid+1,r,L,R);
else return query(t[k].lc,l,mid,L,R)+query(t[k].rc,mid+1,r,L,R);

query 完整代码:

int query(int k,int l,int r,int L,int R){
	if(L<=l&&r<=R)return t[k].sum;
	int mid=(l+r)>>1;
	if(R<mid)return query(t[k].lc,l,mid,L,R);
	else if(L>mid)return query(t[k].rc,mid+1,r,L,R);
	else return query(t[k].lc,l,mid,L,R)+query(t[k].rc,mid+1,r,L,R);	
}
2024/5/4 11:42
加载中...