社区讨论
关于线段树的结构体封装
学术版参与者 6已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @mi3yhjd8
- 此快照首次捕获于
- 2025/11/18 10:30 4 个月前
- 此快照最后确认于
- 2025/11/18 23:52 4 个月前
首先提供两份代码
Cstruct 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;
Cstruct 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;
第二份与第一份唯一的区别就是第二份对线段树的 进行了结构体封装,但在这题中却快了足足3到4s,请问为什么。
回复
共 9 条回复,欢迎继续交流。
正在加载回复...