社区讨论

关于线段树的结构体封装

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

讨论操作

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

当前回复
9 条
当前快照
1 份
快照标识符
@mi3yhjd8
此快照首次捕获于
2025/11/18 10:30
4 个月前
此快照最后确认于
2025/11/18 23:52
4 个月前
查看原帖
首先提供两份代码
C
struct segtree{
	int sum[N*350],ls[N*350],rs[N*350],cnt;
	void upd(int &p,int l,int r,int x,int v){
		if(!p)p=++cnt;
		sum[p]+=v;
		if(l==r)return ;
		int mid=(l+r)>>1;
		if(mid>=x)upd(ls[p],l,mid,x,v);
		else upd(rs[p],mid+1,r,x,v);
	}
	int qry(int p,int l,int r,int x,bool op){
		if(!p||!x||x>nn)return 0;
		if(l==r)return sum[p];
		int mid=(l+r)>>1;
		if(op==0){
			if(mid>=x)return qry(ls[p],l,mid,x,op);
			else return sum[ls[p]]+qry(rs[p],mid+1,r,x,op);
		}
		if(op==1){
			if(mid>=x)return qry(ls[p],l,mid,x,op)+sum[rs[p]];
			else return qry(rs[p],mid+1,r,x,op);
		}
	}
}s0;
C
struct node{
	int sum,ls,rs;
};
struct segtree{
	node tr[N*350];
	int cnt;
	void upd(int &p,int l,int r,int x,int v){
		if(!p)p=++cnt;
		tr[p].sum+=v;
		if(l==r)return ;
		int mid=(l+r)>>1;
		if(mid>=x)upd(tr[p].ls,l,mid,x,v);
		else upd(tr[p].rs,mid+1,r,x,v);
	}
	int qry(int p,int l,int r,int x,int y){
		if(x>y||!p)return 0;
		if(l>=x&&r<=y)return tr[p].sum;
		int mid=(l+r)>>1,ans=0;
		if(mid>=x)ans+=qry(tr[p].ls,l,mid,x,y);
		if(mid<y)ans+=qry(tr[p].rs,mid+1,r,x,y);
		return ans;
	}
}s0;
第二份与第一份唯一的区别就是第二份对线段树的 sum,ls,rssum,ls,rs 进行了结构体封装,但在这题中却快了足足3到4s,请问为什么。

回复

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

正在加载回复...