社区讨论

本地运行过不去,全RE

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

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@lo1vqrsi
此快照首次捕获于
2023/10/23 03:46
2 年前
此快照最后确认于
2023/11/03 04:15
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int a[N],t[N<<2],lazy[N<<2];

struct TREE{
	void pushdown(int k){
		if(lazy[k]){
			lazy[k<<1]+=lazy[k];
			lazy[k<1|1]+=lazy[k];
			t[k<<1]+=lazy[k];
			t[k<<1|1]+=lazy[k];
			lazy[k]=0;
		}
	}
	void pushup(int k){
		t[k]=t[k<<1]+t[k<<1|1];
	}
	void build(int k,int l,int r){//建树
		if(l==r){
			t[k]=a[l];
		}
		else{
			int m=l+((r-l)>>1);
			build(k<<1,l,m);
			build(k<<1|1,m+1,r);
			pushup(k);
		}
	}
	void updata1(int p,int v,int l,int r,int k){//单点修改
		//p 为要修改的的下标,v 为要修改的权值
		if(l==r){
			t[k]+=v,a[k]+=v;
		}
		else{
			int m=l+((r-l)>>1);
			if(p<=m){
				updata1(p,v,l,m,k<<1);
			}
			else updata1(p,v,m+1,r,k<<1|1);
			pushup(k);
		}
	}
	int query1(int L,int R,int l,int r,int k){//区间查询
		if(L<=l&&r<=R)return t[k];
		else{
			int res=0;
			int m=l+((r-l)>>1);
			if(L<=m){
				res+=query1(L,R,l,m,k<<1);
			}
			if(R>m){
				res+=query1(L,R,m+1,r,k<<1|1);
			}
			return res;
		}
	}
	void updata2(int L,int R,int v,int l,int r,int k){//区间修改
		if(L<=l&&r<+R){
			lazy[k]+=v,t[k]+=v;
		}
		else{
			pushdown(k);
			int m=l+((r-l)>>1);
			if(L<=m){
				updata2(L,R,v,l,m,k<<1);
			}
			if(r>m){
				updata2(L,R,v,m+1,r,k<<1|1);
			}
			pushup(k);
		}
	}
	int query2(int L,int R,int l,int r,int k){//区间查询
		if(L<=l&&r<=R)return t[k];
		else{
			int res=0;
			pushdown(k);
			int m=l+((r-l)>>1);
			if(L<=m){
				res+=query2(L,R,l,m,k<<1);
			}
			if(R>m){
				res+=query2(L,R,m+1,r,k<<1|1);
			}
			return res;
		}
	}
}T;
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	T.build(1,1,n);
	while(m--){
		int x,y,k,opt;
		cin>>opt;
		opt--;
		if(!opt){
			cin>>x>>y>>k;
			T.updata2(x,y,k,1,n,1);
		}
		else{
			cin>>x>>y;
			cout<<T.query2(x,y,1,n,1)<<'\n';	
		}
	}
	return 0;
}

回复

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

正在加载回复...