1 个问答
你初始化线段树分了两步,效率比较低
build(1,1,n); // 创建结点
for(int i=1;i<=n;i++){
scanf("%d",&d);
add(1,i,i,d); // 修改每个节点的sum
}
这两步可以直接合并成一步,在build里面完成
int a[N];
void build(int u,int l,int r){
tr[u]={l,r,r-l+1,a[l],0,1}; // 初始化sum
if(l==r)return;
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u); // pushup
}
int main()
{
...
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
...
}