社区讨论

萌新wa求调

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

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@lth5hsye
此快照首次捕获于
2024/03/07 19:34
2 年前
此快照最后确认于
2024/03/07 21:41
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int M=100005;
int n,m;
int a[M];
struct Tree{
	int l,r,add;
	long long d;
}t[M*4];
void build(int p,int l,int r)
{
	t[p].l=l;
	t[p].r=r;
	t[p].add=0;
	if(l==r)
	{
		t[p].d=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].d=t[p*2].d+t[p*2+1].d;
}
void check(int p)
{
	if(t[p].add)
	{
		t[p*2].add+=t[p].add;
		t[p*2+1].add+=t[p].add;
		t[p*2].d+=(t[p*2].r-t[p*2].l+1)*t[p].add;
		t[p*2+1].d+=(t[p*2+1].r-t[p*2+1].l+1)*t[p].add;
		t[p].add=0;
	}
}
void change(int p,int l,int r,int add)
{
//	cout<<p<<'	';
//	if(p>n*4)return;
	if(l<=t[p].l and r>=t[p].r)
	{
		t[p].add+=add;
		t[p].d+=(t[p].r-t[p].l+1)*add;
		return;
	}
	if(t[p].l==t[p].r)
	{
		t[p].d+=add;
		return;
	}
	check(p);
	int mid=(t[p].l+t[p].r)/2;
	if(mid>=l)change(p*2,l,r,add);
	if(mid<r)change(p*2+1,l,r,add);
	t[p].d=t[p*2].d+t[p*2+1].d;
}
long long ask(int p,int l,int r)
{
//	if(p>n*4)return 0;
	if(l<=t[p].l and r>=t[p].r)return t[p].d;
	if(t[p].l==t[p].r)return t[p].d;
	check(p);
	int mid=(t[p].l+t[p].r)/2;
	long long rt=0;
	if(mid>=l)rt+=ask(p*2,l,r);
	if(mid< r)rt+=ask(p*2+1,l,r);
	printf("%d[%d , %d] : %d\n",p,t[p].l,t[p].r,rt);
	return rt;
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)cin>>a[i];
	while(m--)
	{
		int tp;
		cin>>tp;
		if(tp==1)
		{
			int x,y,k;
			cin>>x>>y>>k;
			change(1,x,y,k);
		}
		else 
		{
			int x,y;
			cin>>x>>y;
			cout<<ask(1,x,y)<<'\n';
		}
	}
}

回复

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

正在加载回复...