线段树模板

开局宏定义:

#include<bits/stdc++.h>
#define int long long
#define lson (now << 1)//现结点的左孩子
#define rson (now << 1 | 1)//右孩子
using namespace std;

结构体定义:

struct Node{
    int l ,r;  //表示左右区间
    int max, sum; //其他数据域
}tree[N << 2] //=N*4,N指节点个数

常规操作

  • 向上回溯:
void push_up(int now){
    tree[now].sum = tree[lson].sum + tree[rson].sum;
    tree[now].max = max(tree[lson].max, tree[rson].max);
}
  • 建树:
void build(int now, int l, int r) {
    tree[now].left = l; tree[now].right = r;

    if(l == r){
        tree[now].sum = a[l];
        return;
    }

    int mid = (l + r) >> 1;
    build(lson, l, mid),build(rson, mid+1, r);

    push_up(now);
}
  • 单点更新:
void update(int now, int pos, int key){
    if(l == r){
        tree[now].sum = tree[now].max = key;
        return;        
    }

    int mid = (tree[now].left + tree[now].right) >> 1;

    if(pos <= mid) update(lson, pos, key);
    else update(rson, pos, key);

    push_up(now);
}
  • 查询区间和:
 int query(int now, int l, int r){
    int s = 0;
    if( l <= tree[now].left and tree[now].right <= r)
          return tree[now],sum;
    
    int mid = (tree[now].left + tree[now].rigth) >> 1;

    if(l <= mid) s += query(lson, l, r);
    if(r > mid) s += query(rson, l, r);
    return s;
}

区间更新操作

  • 区间更新:
 int update (int now, int l, int r, int val){
    if(l <= tree[now].left and tree[now].right <= r){
        tree[now].lazy += val;
        tree[now].sum += val * (tree[now].right - tree[now].left + 1);
        return;
    }

    push_down(now);
    int mid = (tree[now].left + tree[now].right) >> 1;
    if(l <= mid) update(lson, l, r, val);
    if(r > mid) update(rson, l, r, val);

    push_up(now);
}
  • 延迟标记:
void push_down(int now){
    if(tree[now].lazy){
        int lz = tree[now].lazy;
        tree[now].lazy = 0;
        tree[lson].lazy += lz;
        tree[rson].lazy += lz;
        tree[lson].sum += lz * (tree[lson].right - tree[lson].left + 1);
        tree[rson].sum += lz * (tree[rson].right - tree[rson].left + 1); 
     }
}
  • 查询区间和(区间更新版):
int query(int now, int l, int r){
    int sum = 0;
    if(l <= tree[now].left and tree[now].right <= r)
        return tree[now].sum;

    push_down(now);
    int mid = (tree[now].left + tree[now].right) >> 1;
    if(l <= mid) sum += query(lson, l, r);
    if(r > mid)  sum += query(rson, l, r);

    return sum;
}
posted @   Aqr_Rn  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示