线段树模板

Posted charls

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树模板相关的知识,希望对你有一定的参考价值。

维护区间加法

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

 

以上是关于线段树模板的主要内容,如果未能解决你的问题,请参考以下文章

线段树模板整理

线段树模板总结

线段树模板

模板线段树-单点修改,区间查询

P3834 模板可持久化线段树 1(主席树)

模板 线段树(部分功能)