线段树
代码
单点加,区间和。
#include<bits/stdc++.h>
using namespace std;
const int N =5e5+10;
struct TREE{
int v,l,r;
}c[N<<2];
#define l(i) ((i)<<1)
#define r(i) (((i)<<1)+1)
int a[N],n,m;
void build(int k,int l,int r) {
c[k].l=l,c[k].r=r;
if(l==r) {c[k].v=a[l]; return ;}
int mid=l+r>>1;
build(l(k),l,mid);
build(r(k),mid+1,r);
c[k].v=c[l(k)].v+c[r(k)].v;
}
void upd(int k,int x,int v) {
if(c[k].l==c[k].r) {c[k].v+=v; return ;}
int mid=c[k].l+c[k].r>>1;
if(x<=mid) upd(l(k),x,v);
else upd(r(k),x,v);
c[k].v=c[l(k)].v+c[r(k)].v;
}
int ask(int k,int x,int y) {
if(x<=c[k].l&&c[k].r<=y) return c[k].v;
int mid=c[k].l+c[k].r>>1,v=0;
if(x<=mid) v+=ask(l(k),x,y);
if(y>mid) v+=ask(r(k),x,y);
return v;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) {
cin>>a[i];
}
build(1,1,n);
while(m--) {
int o,l,r;
cin>>o>>l>>r;
if(o==1) {
upd(1,l,r);
}
else
cout<<ask(1,l,r)<<"\n";
}
return 0;
}
区间加,区间和。
#include<bits/stdc++.h>
using namespace std;
const int N =5e5+10;
#define int long long
struct TREE{
int v,l,r,p;
#define l(i) ((i)<<1)
#define r(i) (((i)<<1)+1)
}c[N<<2];
int a[N],n,m;
void build(int k,int l,int r) {
c[k].l=l,c[k].r=r;
if(l==r) {c[k].v=a[l]; return ;}
int mid=l+r>>1;
build(l(k),l,mid);
build(r(k),mid+1,r);
c[k].v=c[l(k)].v+c[r(k)].v;
}
void spd(int k) {
if(c[k].p) {
c[l(k)].v+=c[k].p*(c[l(k)].r-c[l(k)].l+1);
c[r(k)].v+=c[k].p*(c[r(k)].r-c[r(k)].l+1);
c[l(k)].p+=c[k].p;
c[r(k)].p+=c[k].p;
c[k].p=0;
}
}
void upd(int k,int x,int y,int v) {
if(x<=c[k].l&&c[k].r<=y) {
c[k].v+=(c[k].r-c[k].l+1)*v;
c[k].p+=v;
return ;
}
spd(k);
int mid=c[k].l+c[k].r>>1;
if(x<=mid) upd(l(k),x,y,v);
if(y>mid) upd(r(k),x,y,v);
c[k].v=c[l(k)].v+c[r(k)].v;
}
int ask(int k,int x,int y) {
if(x<=c[k].l&&c[k].r<=y) return c[k].v;
spd(k);
int mid=c[k].l+c[k].r>>1,v=0;
if(x<=mid) v+=ask(l(k),x,y);
if(y>mid) v+=ask(r(k),x,y);
return v;
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) {
cin>>a[i];
}
build(1,1,n);
while(m--) {
int o,l,r,k;
cin>>o>>l>>r;
if(o==1) {
cin>>k;
upd(1,l,r,k);
}
else {
cout<<ask(1,l,r)<<"\n";
}
}
return 0;
}

浙公网安备 33010602011771号