线段树全RE求调

P3372 【模板】线段树 1

@[blackmonkey](/user/636008) RE是因为您modify一段区间后没return
by GSRgsrgsr @ 2023-08-25 19:18:44


```cpp #include <bits/stdc++.h> #define ll long long using namespace std; ll tree[400001],lan[400001],a[100001]; int n,m; void init(int u,int l,int r){ if(l==r){ tree[u]=a[l]; return; } int mid=(l+r)>>1; init(1<<u,l,mid); init(1<<u|1,mid+1,r); tree[u]=tree[u<<1]+tree[u<<1|1]; } void pushdown(int u,int l,int r,int mid){ if(lan[u]==0) return; lan[u<<1]+=lan[u]; tree[u<<1]+=lan[u]*(mid-l+1); lan[u<<1|1]+=lan[u]; tree[u<<1|1]+=lan[u]*(r-mid); lan[u]=0; } ll query(int u,int l,int r,int ql,int qr){ if(l>=ql && r<=qr) return tree[u]; int mid=(l+r)>>1; pushdown(u,l,r,mid); if(ql<=mid && ql>mid) return query(u<<1,l,mid,ql,qr)+query(u<<1|1,mid+1,r,ql,qr); else if(qr<=mid) return query(u<<1,l,mid,ql,qr); else return query(u<<1|1,mid+1,r,ql,qr); } void modify(int u,int l,int r,int ql,int qr,ll v){ if(l>=ql && r<=qr){ tree[u]+=v*(r-l+1); lan[u]+=v; return; } int mid=(l+r)>>1; pushdown(u,l,r,mid); if(ql<=mid && ql>mid){ modify(u<<1,l,mid,ql,qr,v); modify(u<<1|1,mid+1,r,ql,qr,v); } else if(qr<=mid) modify(u<<1,l,mid,ql,qr,v); else modify(u<<1|1,mid+1,r,ql,qr,v); tree[u]=tree[u<<1]+tree[u<<1|1]; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i){ scanf("%lld",&a[i]); } init(1,1,n); int id,x,y; long long k; while(m--){ scanf("%d",&id); if(id==1){ scanf("%d%d%lld",&x,&y,&k); modify(1,1,n,x,y,k); } else{ scanf("%d%d",&x,&y); printf("%lld\n",query(1,1,n,x,y)); } } return 0; } ``` 此外还有若干小问题,现在是WA,自己看吧
by GSRgsrgsr @ 2023-08-25 19:19:26


谢谢大佬
by blackmonkey @ 2023-08-25 19:20:19


```cpp #include <bits/stdc++.h> #define ll long long using namespace std; ll tree[400001],lan[400001],a[100001]; int n,m; void init(int u,int l,int r){ if(l==r){ tree[u]=a[l]; return; } int mid=(l+r)>>1; init(u<<1,l,mid); init(u<<1|1,mid+1,r); tree[u]=tree[u<<1]+tree[u<<1|1]; } void pushdown(int u,int l,int r,int mid){ if(lan[u]==0) return; lan[u<<1]+=lan[u]; tree[u<<1]+=lan[u]*(mid-l+1); lan[u<<1|1]+=lan[u]; tree[u<<1|1]+=lan[u]*(r-mid); lan[u]=0; } ll query(int u,int l,int r,int ql,int qr){ if(l>=ql && r<=qr) return tree[u]; int mid=(l+r)>>1; pushdown(u,l,r,mid); if(ql<=mid && qr>mid) return query(u<<1,l,mid,ql,qr)+query(u<<1|1,mid+1,r,ql,qr); else if(qr<=mid) return query(u<<1,l,mid,ql,qr); else return query(u<<1|1,mid+1,r,ql,qr); } void modify(int u,int l,int r,int ql,int qr,ll v){ if(l>=ql && r<=qr){ tree[u]+=v*(r-l+1); lan[u]+=v; return; } int mid=(l+r)>>1; pushdown(u,l,r,mid); if(ql<=mid && qr>mid){ modify(u<<1,l,mid,ql,qr,v); modify(u<<1|1,mid+1,r,ql,qr,v); } else if(qr<=mid) modify(u<<1,l,mid,ql,qr,v); else modify(u<<1|1,mid+1,r,ql,qr,v); tree[u]=tree[u<<1]+tree[u<<1|1]; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i){ scanf("%lld",&a[i]); } init(1,1,n); int id,x,y; long long k; while(m--){ scanf("%d",&id); if(id==1){ scanf("%d%d%lld",&x,&y,&k); modify(1,1,n,x,y,k); } else{ scanf("%d%d",&x,&y); printf("%lld\n",query(1,1,n,x,y)); } } return 0; } ``` 又改了好几处。。。现在过了,您自己对着找不同吧
by GSRgsrgsr @ 2023-08-25 19:28:39


okok
by blackmonkey @ 2023-08-25 19:38:24


|