@[Dubhe_](/user/212172) ```update```函数里对子树进行更新值之前要先下放懒标记,以及数组开大点就AC了![](//图.tk/e)
```cpp
#include<bits/stdc++.h>
using namespace std;
long long T[400005<<1];
long long A[400005<<1];
int n,m,ord,lin,rin;
long long num;
long long Lazy[200005<<1];
void PutDown(int k,int l,int r){ //下放Lazy标记
if(Lazy[k]){
Lazy[k*2]+=Lazy[k];
Lazy[k*2+1]+=Lazy[k];
int mid=(l+r)/2;
T[k*2]+=(mid-l+1)*Lazy[k];
T[k*2+1]+=(r-mid)*Lazy[k];
Lazy[k]=0;
}
} //下放懒标记
void BuildTree(int k,int l,int r){
if(l==r) T[k]=A[l]; //边界情况判断
else{
int mid=(l+r)/2;
BuildTree(k*2,l,mid);
BuildTree(k*2+1,mid+1,r); //递归建树
T[k]=T[k*2]+T[k*2+1]; //更新当前节点值
}
}
void Update(int k,int l,int r){
if(lin<=l&&rin>=r){ //完全包含于修改区间
T[k]+=num*(r-l+1); //直接更新该点的值
Lazy[k]+=num; //更新该点Lazy数组
return;
}
if(l>rin||r<lin) return; //完全不包含的直接跳过
//下面是有一部分包含的
int mid=(l+r)/2;
PutDown(k,l,r);
if(lin<=mid) Update(k*2,l,mid); //更新左区间
if(rin>mid) Update(k*2+1,mid+1,r); //更新右区间
T[k]=T[k*2]+T[k*2+1]; //更新当前的数组
}
long long GetSum(int k,int l,int r){
long long ans=0; //定义答案数组
if(lin<=l&&rin>=r){
return T[k]; //如果完全包含则直接返回
}
if(l>rin||r<lin) return 0; //完全不包含也直接返回
int mid=(l+r)/2;
PutDown(k,l,r); //用到子树的时候下放懒标记
if(lin<=mid) ans+=GetSum(k*2,l,mid);
if(rin>mid) ans+=GetSum(k*2+1,mid+1,r);//因为右侧从mid+1开始
//所以mid不在r的考虑范围内
return ans;//返回答案
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&A[i]);
}
BuildTree(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d",&ord);
if(ord==1){
scanf("%d%d%lld",&lin,&rin,&num);
Update(1,1,n);
}
else{
scanf("%d%d",&lin,&rin);
long long ans=GetSum(1,1,n);
printf("%lld\n",ans);
}
}
}
```
by Waaifu_D @ 2021-09-26 20:05:35
样例什么的都过了,结果提交之后就过了一个点,其他全WA...蒟蒻求救。
by Dubhe_ @ 2021-09-26 20:06:15
@[Waaifu_D](/user/358779) 感谢红名大佬的指点!!!
%了
by Dubhe_ @ 2021-09-26 20:19:18
@[Dubhe_](/user/212172) ![](//图.tk/0)大可不必,我只是蒟蒻
by Waaifu_D @ 2021-09-26 20:20:53
@[Waaifu_D](/user/358779) 别别别/(ㄒoㄒ)/~~
by Dubhe_ @ 2021-09-26 20:27:28