码迷,mamicode.com
首页 > 其他好文 > 详细

线段树模板

时间:2020-05-23 18:04:04      阅读:40      评论:0      收藏:0      [点我收藏+]

标签:main   线段树   ++   ==   clu   else   max   lin   oid   

维护区间加法

https://www.luogu.com.cn/problem/P3374

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxN=500000;
struct Node{
    int l;
    int r;
    ll sum;
    ll add;
    Node(){
        l=0;
        r=0;
        sum=0;
    } 

}Tree[maxN*4];
int n,m;
int a[500005];
inline int lc(int p){
    return p<<1;
}
inline int rc(int p){
    return p<<1|1;
}
long long ans=0;
void BuildTree(int k,int l,int r)
{
    Tree[k].l=l;
    Tree[k].r=r;
    if(l==r){
        
        Tree[k].sum=a[l];
        return;
    }
    int mid=(l+r)>>1;
    BuildTree(k<<1,l,mid);
    BuildTree(k<<1|1,mid+1,r);
    Tree[k].sum=Tree[k<<1].sum+Tree[k<<1|1].sum;
}

void push_down(int id)
{
    if(Tree[id].add)
    {
        int v=Tree[id].add;
        Tree[id].add=0;
        Tree[id<<1].sum+=v*(Tree[id<<1].r-Tree[id<<1].l+1);
        Tree[id<<1|1].sum+=v*(Tree[id<<1|1].r-Tree[id<<1|1].l+1);
        Tree[id<<1].add+=v;
        Tree[id<<1|1].add+=v;
    }
}
void update(int id,int l,int r,int k)
{
    if(l<=Tree[id].l&&Tree[id].r<=r)
    {
        Tree[id].sum+=k*(Tree[id].r-Tree[id].l+1);
        Tree[id].add+=k;
        return;
    }
    push_down(id);
    int mid=(Tree[id].l+Tree[id].r)>>1;
    if(l<=mid) update(id<<1,l,r,k);
    if(r>=mid+1) update(id<<1|1,l,r,k);
    Tree[id].sum=Tree[id<<1].sum+Tree[id<<1|1].sum;

}

void Query(int id,int l,int r)
{
    if(l<=Tree[id].l&&Tree[id].r<=r)
    {
        ans+=Tree[id].sum;
        return;
    }
    push_down(id);
    int mid=(Tree[id].l+Tree[id].r)>>1;
    if(l<=mid) Query(id<<1,l,r);
    if(r>=mid+1) Query(id<<1|1,l,r);

}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    BuildTree(1,1,n);
    int type,x,y,k;
    for(int i=0;i<m;i++)
    {
        cin>>type;
        if(type==1)
        {
            cin>>x>>y>>k;
            update(1,x,y,k);
        }
        else
        {
            ans=0;
            cin>>x>>y;
            Query(1,x,y);
            cout<<ans<<endl;
        }
        
    }
}

 

线段树模板

标签:main   线段树   ++   ==   clu   else   max   lin   oid   

原文地址:https://www.cnblogs.com/Charls/p/12943483.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!