Never_Gone @ 2023-11-14 18:01:33
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1000010;
int a[maxn],tag[maxn<<2],ans[maxn<<2];
int n,m;
int ls(int b){
return b<<1;
}
int rs(int b){
return b<<1|1;
}
void push_up(int b){
ans[b]=ans[ls(b)]+ans[rs(b)];
}
void build(int p,int l,int r){
//cout<<1<<endl;
tag[p]=0;
if(l==r) {ans[p]=a[l]; return;}
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
void f(int p,int l,int r,int k){
tag[p]=tag[p]+k;
ans[p]=ans[p]+k*(r-l+1);
}
void push_down(int p,int l,int r){
int mid=(l+r)>>1;
f(ls(p),l,mid,tag[p]);
f(rs(p),mid+1,r,tag[p]);
tag[p]=0;
}
void update(int nl,int nr,int l,int r,int p,int k){
if(nl<=l && nr>=r) {//到达叶节点
ans[p]+=k*(r-l+1);
tag[p]+=k;
return;
}
push_down(p,l,r);//回溯
int mid=(l+r)>>1;
if(nl<=mid) update(nl,nr,l,mid,ls(p),k);
if(nr>mid) update(nl,nr,mid+1,r,rs(p),k);
push_up(p);
}
int query(int qx,int qy,int l,int r,int p){
int cnt;
if(qx<=l && qy>=r) return ans[p];
int mid=(l+r)>>1;
push_down(p,l,r);//回溯
if(qx<=mid) cnt+=query(qx,qy,l,mid,ls(p));
if(qy>mid) cnt+=query(qx,qy,mid+1,r,rs(p));
return cnt;
}
signed main()
{
//cin.tie(0),cout.tie(0);
//ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(n,n,1);
//cout<<2;
for(int i=1;i<=m;i++){
int q;
cin>>q;
if(q==1){
int b,c,d;
cin>>b>>c>>d;
update(b,c,1,n,1,d);
}
else{
int b,c;
cin>>b>>c;
int d=query(b,c,1,n,1);
cout<<d<<"\n";
}
}
return 0;
}
by xjx13563169001 @ 2023-11-14 18:35:07
居然能遇到和我一样的线段树非结构体版本的。
两个问题:
1.main函数里调用build的时候参数写错了。
2.求和的时候cnt没有初始化。
多练几遍就好了。
求关注!
by xjx13563169001 @ 2023-11-14 18:35:53
@Never_Gone
by Never_Gone @ 2023-11-15 16:13:18
@xjx13563169001
艹,犯傻写错了谢谢,已关