社区讨论

样例过,15分求条

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mclgo9uh
此快照首次捕获于
2025/07/02 12:33
8 个月前
此快照最后确认于
2025/11/04 06:49
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct tree{
	int l,r,w,lazy;	
};
int n,m;
vector<int>a;
vector<tree>tr;
void update(int k)
{
	tr[k].w=tr[k*2].w+tr[k*2+1].w;
}
void push_down(int k)
{
	if(tr[k].l==tr[k].r)
	{
		tr[k].lazy=0;
		return;
	}
	tr[k*2].w+= (tr[k*2].r-tr[k*2].l+1)*tr[k].lazy;
	tr[k*2+1].w+= (tr[k*2+1].r-tr[k*2+1].l+1)*tr[k].lazy;
	
	tr[k*2].lazy+=tr[k].lazy;
	tr[k*2+1].lazy+=tr[k].lazy;
	tr[k].lazy=0;
}
void build(int p,int x,int y)
{
	tr[p].l=x;
	tr[p].r=y;
	if(x==y)
	{
		tr[p].w=a[x];
		return ;
	}
	int mid=(x+y)/2;
	build(p*2,x,mid);
	build(p*2+1,mid+1,y);
	update(p);
}
void change(int p,int x,int y,int z)
{
	if(tr[p].l==x &&tr[p].r==y)
	{
		tr[p].w+=(y-x+1)*z;
		tr[p].lazy+=z;
		return ;
	}
	int mid=(tr[p].l+tr[p].r)/2;
	if(y<=mid)
	{
		change(p*2,x,y,z);
	}
	else if(x>mid)
	{
		change(p*2+1,x,y,z);
	}
	else{
		change(p*2,x,mid,z);
		change(p*2+1,mid+1,y,z);
	}
	update(p);
}
int quary(int p,int x,int y)
{
	if(tr[p].lazy)push_down(p);
	if(tr[p].l==x &&tr[p].r==y)
	{
		return tr[p].w;
	}
	int mid=(tr[p].l+tr[p].r)/2;
	if(mid>=y)
	{
		return quary(p*2,x,y);
	}
	else if(mid<x)
	{
		return quary(p*2+1,x,y);
	}
	return quary(p*2,x,mid)+quary(p*2+1,mid+1,y);
	
}
signed main()
{
	cin>>n>>m;
	a.resize(n+1);
	tr.resize(n*4+5);
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=0;i<m;i++)
	{
		int a,x,y,k;
		cin>>a>>x>>y;
		if(a==1)
		{
			cin>>k;
			change(1,x,y,k);
		}
		else{
			cout<<quary(1,x,y)<<endl;
		}
	}
}

回复

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

正在加载回复...