转眼之间,一个月过去了。昨天晚上我还躺在床上颓废,想着自己这一个月过得浑浑噩噩,什么都没干,但回头看看自己这一个月发的帖子,突然发现这一个月过得还很充实且有意义。后面还有各种课程作业考试,我必须重新振作起来,努力做好自己该做的事情。
这段话算是我对这个月的小总结了,后面不知道再写什么了,水段线段树模板吧(

#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;
        }
    }
}

标签: none

仅有一条评论

  1. KM_ KM_

    看来以后可以把北地心念当CSDN用了

添加新评论