社区讨论
求条
P3372【模板】线段树 1参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mjlb67sa
- 此快照首次捕获于
- 2025/12/25 18:37 2 个月前
- 此快照最后确认于
- 2025/12/25 18:41 2 个月前
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,i,op,x,y,k,sum[400010],a[100010],lazy[400010];
void build(int x,int t,int w){
if(t==w){
sum[x]=a[t];
return ;
}
int mid=t+w>>1;
build(x<<2,t,mid);build(x<<2|1,mid+1,w);
sum[x]=sum[x<<2]+sum[x<<2|1];
}
void add(int x,int t,int w,int k){
lazy[x]+=k;sum[x]+=(w-t+1)*k;
return ;
}
void pushdown(int x,int t,int w){
int mid=t+w>>1;
add(x<<1,t,mid,lazy[x]);
add(x<<1|1,mid+1,w,lazy[x]);
lazy[x]=0;
}
void change(int x,int t,int w,int l,int r,int k){
//当前区间编号x当前区间左右tw查询区间lrk
pushdown(x,t,w);
if(l<=t&&w<=r) return add(x,t,w,k);
int mid=t+w>>1;
if(l<=mid) change(x<<1,t,mid,l,r,k);
if(mid<r) change(x<<1|1,mid+1,w,l,r,k);
sum[x]=sum[x<<1]+sum[x<<1|1];
}
int check(int x,int t,int w,int l,int r){
//当前区间编号x当前区间左右tw查询区间lr
pushdown(x,t,w);
if(l<=t&&w<=r) return sum[x];
int mid=t+w>>1,ans=0;
if(l<=mid) ans+=check(x<<1,t,mid,l,r);
if(mid<r) ans+=check(x<<1|1,mid+1,w,l,r);
return ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>m;
for(i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--){
cin>>op>>x>>y;
if(op==1){
cin>>k;
change(1,1,n,x,y,k);
}
else cout<<check(1,1,n,x,y)<<"\n";
}
return 0;
}
燃尽了,样例不过
回复
共 1 条回复,欢迎继续交流。
正在加载回复...