社区讨论

Help

学术版参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lvpa0zpx
此快照首次捕获于
2024/05/02 21:23
2 年前
此快照最后确认于
2024/05/03 07:15
2 年前
查看原帖
今天无聊练模板 线段树居然挂了 大佬帮忙看看
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,add[100001*4],sum[100001*4];
void Add(int k,int l,int r,int v){
	add[k]+=v;
	sum[k]+=(r-l+1)*v;
	return ;
}
void pushdown(int k,int l,int r,int mid){
	if(add[k]==0) return ;
	Add(k*2,l,mid,add[k]);
	Add(k*2+1,mid+1,r,add[k]);
	add[k]=0;
	return ;
}
void modify(int k,int l,int r,int x,int y,int v){
	if(x<=l and r<=y){
		Add(k,l,r,v);
		return ;
	}
	int mid=(l+r)/2;
	pushdown(k,l,r,mid);
	if(x<=mid) modify(k*2,l,mid,x,y,v);
	if(mid<y) modify(k*2+1,mid+1,r,x,y,v);
}
int query(int k,int l,int r,int x,int y){
	if(x<=l and r<=y) return sum[k];
	int mid=(l+r)/2;
	pushdown(k,l,r,mid);
	int ans=0;
	if(x<=mid) ans+=query(k*2,l,mid,x,y);
	if(mid<y) ans+=query(k*2+1,mid+1,r,x,y);
	return ans;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		modify(1,1,n,i,i,x);
	}
	for(int i=1;i<=m;i++){
		char opt;
		cin>>opt;
		if(opt=='C'){//修改 
			int l,r,x;
			cin>>l>>r>>x;
			modify(1,1,n,l,r,x);
		}else{//查询 
			int l,r;
			cin>>l>>r;
			cout<<query(1,1,n,l,r)<<endl;
		}
	}
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...