社区讨论
各位巨佬帮忙看一看,我线段树渣到样例都没过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 条回复,欢迎继续交流。
正在加载回复...