社区讨论

各位巨佬帮忙看一看,我线段树渣到样例都没过QAQ

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

讨论操作

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

当前回复
12 条
当前快照
1 份
快照标识符
@mi7cjwoy
此快照首次捕获于
2025/11/20 19:27
4 个月前
此快照最后确认于
2025/11/20 21:56
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
long long N,M;
long long ans;
long long a[100005];
long long tr[400005],tag[400005];
void build(long long l,long long r,long 
long k)

{
	tag[k]=0;
	if(l==r)
	{
		tr[k]=a[l];
		return ;
	}
	long long mid=(l+r)/2;
	build(l,mid,k*2);
	build(mid+1,r,k*2+1);
	tr[k]=tr[k*2]+tr[k*2+1];
    
}
void add(long long l,long long r,long long ll,long long rr,long long k)

{

if(l>rr||r<ll)
		return;
	if(l>=ll&&r<=rr)
	{
		ans+=tr[k];
		return ;
	}
	long long mid=(l+r)/2;
	add(l,mid,ll,rr,k*2);
	add(mid+1,r,ll,rr,k*2+1);
	return ;
}
void Add(long long l,long long r,long long p,long long k)
{
	tr[k]+=k*(r-l+1);
	tag[k]+=p;
}
void Lazy(long long l,long long r,long long p,long long ll,long long rr,long long k)
{
	if(l>=ll&&r<=rr)
	{
		tr[k]+=p*(r-l+1);
		tag[k]+=p;
		return ;
	}
	if(ll>r||rr<l)
		return ;
	long long mid=(l+r)/2;
	Add(l,mid,tag[k],k*2);
	Add(mid+1,r,tag[k],k*2+1);
	tag[k]=0;
	Lazy(l,mid,p,ll,rr,k*2);
	Lazy(mid+1,r,p,ll,rr,k*2+1);
	tr[k]=tr[k*2]+tr[k*2+1];
}
int main()
{
	scanf("%d%d",&N,&M);
	for(long long i=1;i<=N;i++)
		scanf("%lld",&a[i]);
	build(1,N,1);
	while(M--)
	{
		long long check,l,r;
		scanf("%d%d%d",&check,&l,&r);
		if(check==1)
		{
			long long k;
			scanf("%lld",&k);
			Lazy(1,N,k,l,r,1);
		}
		else
		{
			ans=0;
			add(l,r,1,N,1);
			printf("%lld",ans);
		}
	}
}

回复

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

正在加载回复...