社区讨论
0分求调
P3372【模板】线段树 1参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mjmb1jee
- 此快照首次捕获于
- 2025/12/26 11:21 2 个月前
- 此快照最后确认于
- 2025/12/27 21:15 2 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
ll a[N],tree[N<<2],tag[N<<2];
void build(ll p,ll pl,ll pr){
tag[p]=0;
if(pl==pr){tree[p]=a[p];return;}
ll mid=(pl+pr)>>1;
build(p<<1,pl,mid);
build(p<<1|1,mid+1,pr);
tree[p]=tree[p<<1]+tree[p<<1|1];
}
void addtag(ll p,ll pl,ll pr,ll d){
tag[p]+=d;
tree[p]+=d*(pr-pl+1);
}
void push_down(ll p,ll pl,ll pr){
if(tag[p]){
ll mid=(pl+pr)>>1;
addtag(p<<1,pl,mid,tag[p]);
addtag(p<<1|1,mid+1,pr,tag[p]);
tag[p]=0;
}
}
void update(ll l,ll r,ll p,ll pl,ll pr,ll d){
if(l<=pl&&pr<=r){addtag(p,pl,pr,d);return;}
push_down(p,pl,pr);
ll mid=(pl+pr)>>1;
if(l<=mid) update(l,r,p<<1,pl,mid,d);
if(r>mid) update(l,r,p<<1|1,mid+1,pr,d);
tree[p]=tree[p<<1]+tree[p<<1|1];
}
ll query(ll l,ll r,ll p,ll pl,ll pr){
if(l<=pl&&pr<=r) return tree[p];
push_down(p,pl,pr);
ll mid=(pl+pr)>>1,sum=0;
if(l<=mid) sum+=query(l,r,p<<1,pl,mid);
if(r>mid) sum+=query(l,r,p<<1|1,mid+1,pr);
return sum;
}
int main(){
ll n,m;
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,1,n);
while(m--){
ll q,l,r,d;
scanf("%lld",&q);
if(q==1){
scanf("%lld%lld%lld",&l,&r,&d);
update(l,r,1,1,n,d);
}
else{
scanf("%lld%lld",&l,&r);
printf("%lld\n",query(l,r,1,1,n));
}
}
return 0;
}
悬一关
回复
共 1 条回复,欢迎继续交流。
正在加载回复...