优雅的小圈子-小圈子
优雅的小圈子

竟然能发代码,那一起来学习吧 线段树模板

​
#include<bits/stdc++.h>
using namespace std;
struct tree{
    long long data,lazy=0,num;
}tree[5000001];
 long long b[5000001];
long long ans=0; 
void build( long long l, long long r, long long rt) //rt是树的编号 
{
    if(l==r) 
    {
        tree[rt].data=b[l]-b[l-1];
        tree[rt].num=r-l+1;
        return;
    }
    tree[rt].data=b[r]-b[l-1];
    tree[rt].num=r-l+1;
     long long mid=(l+r)/2;
    build(l,mid,2*rt);
    build(mid+1,r,2*rt+1);
    return;    
}
void push_down( long long rt, long long k)
{
    if(tree[rt].lazy>0) 
    {
        
        tree[rt].lazy=0;
        tree[2*rt].lazy+=k;
        tree[2*rt].data+=tree[2*rt].num*k;
        tree[2*rt+1].lazy+=k;
        tree[2*rt+1].data+=tree[2*rt+1].num*k;
    }
    return;
}
void add( long long rt, long long l, long long r, long long ql, long long qr, long long k)
{
    if(ql>r||qr<l) return;
    if(ql<=l&&qr>=r)
    {
        tree[rt].lazy+=k;
        tree[rt].data+=(k*tree[rt].num);
        //cout<<"!!!"<<endl;
        return;
    }

     long long mid=(l+r)/2;
     push_down(rt,tree[rt].lazy);//划重点 
    add(2*rt,l,mid,ql,qr,k);
    add(2*rt+1,mid+1,r,ql,qr,k);
    tree[rt].data=tree[2*rt].data+tree[2*rt+1].data;
    return;
}

void check( long long rt, long long l, long long r, long long ql, long long qr)
{
    if(ql>r||qr<l) return;
    
    if(ql<=l&&qr>=r) 
    {
        ans+=tree[rt].data;
        return;
    }
    
     long long mid=(r+l)/2;
     push_down(rt,tree[rt].lazy);
    check(rt*2,l,mid,ql,qr);
    check(rt*2+1,mid+1,r,ql,qr);
    return;
}

int main()
{    
    
     long long n,m;cin>>n>>m;
    for( long long i=1;i<=n;i++)
    {
         long long a;cin>>a;
        b[i]=a+b[i-1];
    }
    build(1,n,1);
    /*for( long long i=1;i<=25;i++)
        {
            cout<<tree[i].data<<' ';
        }
        cout<<endl;*/
    for( long long i=1;i<=m;i++)
    {
         long long a,x,y;cin>>a>>x>>y;
        if(a==1)
        {
             long long k;cin>>k;
            add(1,1,n,x,y,k);
        }
        else 
        {
            ans=0;
            check(1,1,n,x,y);
            cout<<ans<<endl;
        }
        /*for( long long i=1;i<=25;i++)
        {
            cout<<tree[i].data<<' ';
        }
        cout<<endl;*/
    }
    return 0;
 } 

​

 

请登录后发表评论

    没有回复内容