线段树模板
开局宏定义:
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话