社区讨论

线段树10分求助

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lo32vjgi
此快照首次捕获于
2023/10/23 23:54
2 年前
此快照最后确认于
2023/10/23 23:54
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 100005
int n,m,op;
int a[maxn];
struct node{
	int l,r,sum=0,mul=1,lazy=0;
}t[maxn << 2];
void update(int id){
	t[id].sum=t[id<<1].sum+t[id<<1|1].sum;
	return;
}
void buildtree(int id,int l,int r){
	t[id].l=l;
	t[id].r=r;
	if(l==r){
		t[id].sum=a[l];
		return; 
	}
	int mid=(l+r)>>1;
	buildtree(id<<1,l,mid);
	buildtree(id<<1|1,mid+1,r);
	update(id);
	return;
}
void pushdown(int id){
	if(t[id].lazy){
		t[id<<1].lazy+=t[id].lazy;
		t[id<<1].sum+=(t[id<<1].r-t[id].l+1)*t[id].lazy;
		t[id<<1|1].lazy+=t[id].lazy;
		t[id<<1|1].sum+=(t[id].r-t[id].l+1)*t[id].lazy;
		t[id].lazy=0;
	}
	return;
}
void change(int id,int l,int r,int val){
	if(l<=t[id].l && t[id].r<=r){
		t[id].lazy+=val;
		t[id].sum+=(t[id].r-t[id].l+1)*val;
		return;
	}
	pushdown(id);
	int mid=(t[id].l+t[id].r)>>1;
	if(l<=mid) change(id<<1,l,r,val);
	if(r>mid) change(id<<1|1,l,r,val);
	update(id);
	return;
}
int query(int id,int l,int r){
	if(l<=t[id].l && r>=t[id].r){
		return t[id].sum;
	}
	pushdown(id);
	int mid=(t[id].l+t[id].r)>>1;
	int ans=0;
	if(l<=mid) ans+=query(id<<1,l,r);
	if(r>mid) ans+=query(id<<1|1,l,r);
	return ans;
}
signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i=1;i<=n;i++){
		cin >> a[i];
	}
	buildtree(1,1,n);
	while(m--){
		cin >> op;
		if(op==1){
			int x,y,k;
			cin >> x >> y >> k;
			change(1,x,y,k);
		}
		else{
			int x,y;
			cin >> x >> y;
			cout << query(1,x,y) << '\n';
		}
	}
	return 0;
}

回复

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

正在加载回复...