社区讨论

MnZn求助线段树板子

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

讨论操作

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

当前回复
9 条
当前快照
1 份
快照标识符
@lockkzly
此快照首次捕获于
2023/10/30 15:19
2 年前
此快照最后确认于
2023/11/05 02:32
2 年前
查看原帖
贴码
CPP
#include<cstdio>
#include<iostream>
using namespace std;
int n,m;
int a[10012];
int tree[40012];
int mark[40012];
void build(long long now,long long l,long long r) {
	if(l==r) {
		tree[now]=a[l];
	}
	long long mid=l+r/2;
	build(now*2,l,mid);
	build(now*2+1,mid+1,r);
	tree[now]=tree[now*2]+tree[now*2+1];
}
void push_down(long long l,long long r,long long now) {
	if(mark[now]) {
		long long mid=(l+r)/2;
		mark[now*2]+=mark[now];
		mark[now*2+1]+=mark[now];
		tree[now*2]+=(mid-l+1)*mark[now];
		tree[now*2+1]+=(r-mid)*mark[now];
		mark[now]=0;
	}
}
void update(long long l,long long r,long long now,long long ql,long long qr,long long add) {
	if(ql<=l&&qr>=r) {
		mark[now]+=add;
		tree[now]+=(r-l+1)*add;
		return;
	}
	push_down(l,r,now);
	long long mid=(l+r)/2;
	if(mid>=ql) update(l,mid,now*2,ql,qr,add);
	if(mid<qr) update(mid+1,r,now*2+1,ql,qr,add);
	tree[now]=tree[now*2]+tree[now*2+1];
}
long long query(long long l,long long r,long long now,long long ql,long long qr) {
	if(ql<=l&&qr>=r) return tree[now];
	push_down(l,r,now);
	long long mid=(l+r)/2;
	long long ans=0;
	if(mid+1<=qr) ans+=query(mid+1,r,now*2+1,ql,qr);
	if(mid>=ql) ans+=query(l,mid,now*2,ql,qr);
	return ans;
}
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++)scanf("%d",&a[i]);
	build(1,1,n);
	for(int i=1; i<=m; i++) {
		int type;
		scanf("%d",&type);
		if(type==1) {
			long long x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			update(1,n,1,x,y,k);
		}
		if(type==2) {
			long long x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query(1,n,1,x,y));
		}
	}
	return 0;
}
码风丑但希望dalao们来看看吧 /kel

回复

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

正在加载回复...