社区讨论

求条

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 条回复,欢迎继续交流。

正在加载回复...