社区讨论

HELP!

P3372【模板】线段树 1参与者 8已保存回复 21

讨论操作

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

当前回复
21 条
当前快照
1 份
快照标识符
@mi7wwhmu
此快照首次捕获于
2025/11/21 04:56
4 个月前
此快照最后确认于
2025/11/21 06:49
4 个月前
查看原帖
RT,谢谢大佬
code:
CPP
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cctype>
using namespace std;
typedef long long ll;
int n,m,a[100005];
ll sum[100005],tag[100005];
inline int read(){
	int x=0;short w=0;char ch=0;
	while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
	while(isdigit(ch)) {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return w?-x:x;
}
void PushUp(int rt){
	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void PushDown(int rt,int ln,int rn){
	if(tag[rt]){
		tag[rt<<1]+=tag[rt];sum[rt<<1]+=tag[rt]*ln;
		tag[rt<<1|1]+=tag[rt];sum[rt<<1|1]+=tag[rt]*rn;
		tag[rt]=0;
	}
}
void Build(int l,int r,int rt){
	if(l==r){
		sum[l]=a[l];
		return;
	}
	int m=(l+r)>>1;
	Build(l,m,rt<<1);
	Build(m+1,r,rt<<1|1);
	PushUp(rt);
}
void Update(int L,int R,int C,int l,int r,int rt){
	if(L<=l&&r<=R){
		sum[rt]+=C*(r-l+1);
		tag[rt]+=C;
		return;
	}
	int m=(l+r)>>1;
	PushDown(rt,m-l+1,r-m);
	if(L<=m)Update(L,R,C,l,m,rt<<1);
	if(R>m)Update(L,R,C,m+1,r,rt<<1|1);
	PushUp(rt);
}
ll Query(int L,int R,int l,int r,int rt){
	if(L<=l&&r<=R)return sum[rt];
	int m=(l+r)>>1;
	ll res=0;
	if(L<=m)res+=Query(L,R,l,m,rt<<1);
	if(R>m)res+=Query(L,R,m+1,r,rt<<1|1);
	return res;
}
int main(){
	n=read();m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	Build(1,n,1);
	while(m--){
		int tmpq;
		tmpq=read();
		if(tmpq==1){
			int tmpx,tmpy,tmpz;
			tmpx=read();tmpy=read();tmpz=read();
			Update(tmpx,tmpy,tmpz,1,n,1);
		}
		else{
			int tmpx,tmpy;
			tmpx=read();tmpy=read();
			cout<<Query(tmpx,tmpy,1,n,1)<<endl;
		}
	}
	return 0;
}

回复

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

正在加载回复...