星

星尘客栈-笔记站

A text-focused Halo theme

  • 首页
  • 标签
  • 分类
  • 关于本站
主页 线段树模版
文章

线段树模版

发表于 2025-08-19 更新于 2025-08- 19
作者 Ruibin_Ningh
4~5 分钟 阅读

线段树维护区间和

#include<bits/stdc++.h>
using namespace std;
using ll=long long;

vector<ll>tree,lazy;

void init(int n){tree.assign(4*n+5,0);lazy.assign(4*n+5,0);}

void pull(int id){tree[id]=tree[id<<1]+tree[id<<1|1];}

void apply(int id,int l,int r,ll v){tree[id]+=v*(r-l+1);lazy[id]+=v;}

void push(int id,int l,int r){
    if(lazy[id]==0)return;
    int m=(l+r)>>1;
    apply(id<<1,l,m,lazy[id]);
    apply(id<<1|1,m+1,r,lazy[id]);
    lazy[id]=0;
}

void build(int id,int l,int r,const vector<ll>&a){
    if(l==r){tree[id]=a[l];return;}
    int m=(l+r)>>1;
    build(id<<1,l,m,a);
    build(id<<1|1,m+1,r,a);
    pull(id);
}

void add(int id,int l,int r,int L,int R,ll v){
    if(L<=l&&r<=R){apply(id,l,r,v);return;}
    push(id,l,r);
    int m=(l+r)>>1;
    if(L<=m)add(id<<1,l,m,L,R,v);
    if(R>m)add(id<<1|1,m+1,r,L,R,v);
    pull(id);
}

ll sumq(int id,int l,int r,int L,int R){
    if(L<=l&&r<=R)return tree[id];
    push(id,l,r);
    int m=(l+r)>>1;ll s=0;
    if(L<=m)s+=sumq(id<<1,l,m,L,R);
    if(R>m)s+=sumq(id<<1|1,m+1,r,L,R);
    return s;
}

int main(){
    ios::sync_with_stdio(0);cin.tie(0);
    int n;cin>>n;
    vector<ll>a(n+1);
    for(int i=1;i<=n;i++)cin>>a[i];
    init(n);
    build(1,1,n,a);
    int q;cin>>q;
    while(q--){
        int op;cin>>op;
        if(op==1){
            int L,R;ll v;cin>>L>>R>>v;
            add(1,1,n,L,R,v);
        }else{
            int L,R;cin>>L>>R;
            cout<<sumq(1,1,n,L,R)<<"\n";
        }
    }
}

数据结构
线段树 技巧 oi
许可协议:  CC BY 4.0
分享

相关文章

8月 19, 2025

线段树模版

线段树维护区间和 #include<bits/stdc++.h> using namespace std; using ll=long long; vector<ll>tree,lazy; void init(int n){tree.assign(4*n+5,0);lazy.assign(4*n

下一篇

最近公共祖先

上一篇

位运算

最近更新

  • 原码反码和补码
  • 数学中的逻辑运算符
  • 位运算
  • 线段树模版
  • 最近公共祖先

热门标签

oi 线段树 技巧 树上问题 位运算

目录

©2025 星尘客栈-笔记站. 保留部分权利。

使用 Halo 主题 Chirpy