求助 模板 线段树1
  • 板块学术版
  • 楼主Starmiracle
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/10/2 16:05
  • 上次更新2023/10/27 09:12:21
查看原帖
求助 模板 线段树1
534687
Starmiracle楼主2022/10/2 16:05

帮同学问

题目

#include <bits/stdc++.h>
using namespace std;
long long tree[400005],n,num[100005],lazy[400005],m;
void build(long long root,long long start,long long end) {
	if(start==end) {
		tree[root]=num[start];
		return;
	}
	int mid=(start+end)>>1;
	build(root*2,start,mid);
	build(root*2+1,mid+1,end);
	tree[root]=tree[root*2]+tree[root*2+1];
}
void lazydown(long long root,long long start,long long end) {
	if(!lazy[root] || start==end) {
		return;
	}
	int mid=(start+end)>>1;
	tree[root*2]+=lazy[root]*(mid-start+1);
	tree[root*2+1]+=lazy[root]*(end-mid);
	lazy[root*2]+=lazy[root];
	lazy[root*2+1]+=lazy[root];
	lazy[root]=0;
}
int query(long long root,long long start,long long end,long long l,long long r) {
	if(l<=start && r>=end) {
		return tree[root];
	}
	lazydown(root,start,end);
	int mid=(start+end)>>1;
	if(r<=mid) {
		return query(root*2,start,mid,l,r);
	} else if(l>mid) {
		return query(root*2+1,mid+1,end,l,r);
	} else {
		return query(root*2+1,mid+1,end,l,r)+query(root*2,start,mid,l,r);
	}
}
void update(long long root,long long start,long long end,long long l,long long r,long long k) {
	if(l<=start && r>=end) {
		tree[root]+=k*(start-end+1);
		lazy[root]+=k;
		return;
	}
	lazydown(root,start,end);
	int mid=(start+end)>>1;
	if(r<=mid) {
		update(root*2,start,mid,l,r,k);
	} else if(l>mid) {
		update(root*2+1,mid+1,end,l,r,k);
	} else {
		update(root*2+1,mid+1,end,l,r,k);
		update(root*2,start,mid,l,r,k);
	}
	tree[root]=tree[root*2]+tree[root*2+1];
}
int main() {
	cin>>n>>m;
	for(int i=1; i<=n; i++)cin>>num[i];
	build(1,1,n);
	for(int i=1; i<=m; i++) {
		int type,x=0,y=0,k=0;
		cin>>type;
		if(type==1) {
			cin>>x>>y>>k;
			update(1,1,n,x,y,k);
		} else {
			cin>>x>>y;
			cout<<query(1,1,n,x,y)<<endl;
		}
	}
}
2022/10/2 16:05
加载中...