尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

【板子】线段树

【板子】线段树
📅 发布时间:2026/7/8 4:40:25

单点修改区间和

#include <vector> using namespace std; vector<int> tree, a; // 左右儿子快捷函数 int ls(int now) { return now << 1; } int rs(int now) { return now << 1 | 1; } // 向上更新:子节点更新后更新父节点 void pushup(int now) { tree[now] = tree[ls(now)] + tree[rs(now)]; } // 建树:now当前节点,[l,r]对应原数组区间 void build(int now, int l, int r) { if (l == r) { tree[now] = a[l]; return; } int mid = l + r >> 1; build(ls(now), l, mid); build(rs(now), mid + 1, r); pushup(now); } // 区间查询:查询目标[l,r],当前节点p对应区间[pl,pr] int query(int l, int r, int p, int pl, int pr) { if (l <= pl && pr <= r) return tree[p]; int pm = pl + pr >> 1, ans = 0; if (l <= pm) ans += query(l, r, ls(p), pl, pm); if (pm < r) ans += query(l, r, rs(p), pm + 1, pr); return ans; } // 单点修改:原数组id位置加v void update(int id, int v, int now, int l, int r) { if (l == id && r == id) { tree[now] += v; return; } int mid = l + r >> 1; if (id <= mid) update(id, v, ls(now), l, mid); else update(id, v, rs(now), mid + 1, r); pushup(now); }

区间修改区间和

#include <vector> using namespace std; vector<int> tree, a, tag; int ls(int now) { return now << 1; } int rs(int now) { return now << 1 | 1; } // 给节点p对应区间[pl,pr]统一加d,更新值与懒标记 void addtag(int p, int pl, int pr, int d) { tag[p] += d; tree[p] += d * (pr - pl + 1); } // 向上合并子节点信息 void pushup(int now) { tree[now] = tree[ls(now)] + tree[rs(now)]; } // 下放懒标记:把当前节点标记传给左右儿子,清空自身标记 void pushdown(int p, int pl, int pr) { if (!tag[p]) return; int mid = pl + pr >> 1; addtag(ls(p), pl, mid, tag[p]); addtag(rs(p), mid + 1, pr, tag[p]); tag[p] = 0; } // 建树 void build(int now, int l, int r) { if (l == r) { tree[now] = a[l]; return; } int mid = l + r >> 1; build(ls(now), l, mid); build(rs(now), mid + 1, r); pushup(now); } // 区间查询 int query(int l, int r, int p, int pl, int pr) { if (l <= pl && pr <= r) return tree[p]; pushdown(p, pl, pr); // 访问子节点前必须下放标记 int pm = pl + pr >> 1, ans = 0; if (l <= pm) ans += query(l, r, ls(p), pl, pm); if (pm < r) ans += query(l, r, rs(p), pm + 1, pr); return ans; } // 区间修改:[l,r]全部加d void update(int l, int r, int d, int p, int pl, int pr) { if (l <= pl && pr <= r) { addtag(p, pl, pr, d); return; } pushdown(p, pl, pr); // 分裂区间前下放标记 int pm = pl + pr >> 1; if (l <= pm) update(l, r, d, ls(p), pl, pm); if (pm < r) update(l, r, d, rs(p), pm + 1, pr); pushup(p); }

使用说明

  1. 空间:tree、tag都要开4 * n;
  2. 初始化:
    int n; cin >> n; a.resize(n + 1); tree.resize(4 * n); tag.resize(4 * n, 0); for (int i = 1; i <= n; i++) cin >> a[i]; build(1, 1, n);
  3. 区间[L,R]加val:update(L, R, val, 1, 1, n);
  4. 查询区间[L,R]和:query(L, R, 1, 1, n);//1,1,n用于函数递归,固定传整树
  5. 核心关键点:pushdown必须在递归进入子节点前调用,保证子节点数据是最新的。

相关新闻

  • 一文读懂脂质体维生素:技术原理、优势与适用人群
  • OpenAI Tokenizer 编码器解析:3种编码方案如何影响中英文Token计数
  • AI越智能,创作者越累?

最新新闻

  • 构建现代化在线考试平台的完整解决方案:基于Spring Boot + Vue.js的全栈技术架构实践
  • AI语音机器人技术实测解析:传统固定话术机器人 vs 优音通信大模型语音机器人
  • OpenClaw 生产级 Docker Compose 编排与健康检查实践
  • 一晃,就老了
  • 化工行业SAP转型为什么难?从Sun Chemical和陶氏化学的案例看答案
  • PROPKA蛋白质pKa预测工具:从三维结构解析电荷状态的关键技术

日新闻

  • PROPKA 3深度解析:蛋白质pKa预测的实战指南与算法原理
  • 微信小程序 globalData 监听:基于 Object.defineProperty 的 3 种实现方案对比
  • MySQL 8.0 数据清洗实战:3类异常值识别与 UPDATE/DELETE 批量处理

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号