Day30
转眼之间,一个月过去了。昨天晚上我还躺在床上颓废,想着自己这一个月过得浑浑噩噩,什么都没干,但回头看看自己这一个月发的帖子,突然发现这一个月过得还很充实且有意义。后面还有各种课程作业考试,我必须重新振作起来,努力做好自己该做的事情。
这段话算是我对这个月的小总结了,后面不知道再写什么了,水段线段树模板吧(
#include<iostream>
using namespace std;
int n,m,op,x,y;
long long k,a[100005];
struct node{
int L,R;
long long val;
long long LazTag;
}t[400005];
void Build(int l,int r,int p){
t[p].L=l; t[p].R=r;
if(l==r){
t[p].val=a[l];
return;
}
int mid=l+(r-l)/2;
Build(l,mid,2*p);
Build(mid+1,r,2*p+1);
t[p].val=t[2*p].val+t[2*p+1].val;
}
long long Find(int l,int r,int p){
if(l<=t[p].L&&t[p].R<=r)return t[p].val;
int mid=t[p].L+(t[p].R-t[p].L)/2;
long long sum=0;
if(t[p].LazTag&&t[p].L!=t[p].R){
t[p*2].val+=t[p].LazTag*(mid-t[p].L+1);
t[p*2+1].val+=t[p].LazTag*(t[p].R-mid);
t[p*2].LazTag+=t[p].LazTag;
t[p*2+1].LazTag+=t[p].LazTag;
t[p].LazTag=0;
}
if(l<=mid)sum+=Find(l,r,p*2);
if(r>mid)sum+=Find(l,r,p*2+1);
return sum;
}
void Update(int l,int r,int c,int p){
if(l<=t[p].L&&t[p].R<=r){
t[p].val+=(t[p].R-t[p].L+1)*c;
t[p].LazTag+=c;
return;
}
int mid=t[p].L+(t[p].R-t[p].L)/2;
if(t[p].LazTag&&t[p].L!=t[p].R){
t[p*2].val+=t[p].LazTag*(mid-t[p].L+1);
t[p*2+1].val+=t[p].LazTag*(t[p].R-mid);
t[p*2].LazTag+=t[p].LazTag;
t[p*2+1].LazTag+=t[p].LazTag;
t[p].LazTag=0;
}
if(l<=mid)Update(l,r,c,p*2);
if(r>mid)Update(l,r,c,p*2+1);
t[p].val=t[2*p].val+t[2*p+1].val;
}
int main(){
cin>>n>>m;
for(int i=1; i<=n; i++)cin>>a[i];
Build(1,n,1);
for(int i=0; i<m; i++){
cin>>op;
if(op==1){
cin>>x>>y>>k;
Update(x,y,k,1);
}
else if(op==2){
cin>>x>>y;
cout<<Find(x,y,1)<<endl;
}
}
}
看来以后可以把北地心念当CSDN用了