树上点差分算法详解
1. 什么是树上点差分树上点差分是一种基于树形结构通常是无根树的差分算法用于高效处理树上路径上的点权更新与查询问题。它是线性差分思想在树上的自然延伸。核心思想是当需要对树上某条简单路径u → v上的所有点的点权进行统一修改如增加某个值时我们可以通过修改路径端点u和v及其最近公共祖先LCA处的差分值将时间复杂度从 O(路径长度) 优化到 O(1)预处理 LCA 后。2. 算法原理与操作假设我们有一棵以节点 1 为根的树每个节点有一个初始点权val[x]。我们维护一个差分数组diff[x]。点权更新操作将路径u → v上的所有节点的点权增加c。设l LCA(u, v)。对差分数组进行如下修改diff[u] cdiff[v] cdiff[l] - c如果l不是根节点则diff[parent[l]] - c最终点权计算通过一次从根节点开始的深度优先搜索DFS进行前缀和还原。void dfs(int u, int fa) { for (int v : tree[u]) { if (v fa) continue; dfs(v, u); diff[u] diff[v]; // 子节点的差分值累加到父节点 } val[u] diff[u]; // 最终点权 初始点权 差分前缀和 }这样所有更新操作完成后一次 DFS 即可得到所有节点的最终点权。3. 代码实现C以下是一个完整的树上点差分实现示例包含 LCA 的倍增预处理。#include iostream #include vector #include cmath using namespace std; const int MAXN 100005; const int LOG 17; vectorint tree[MAXN]; int depth[MAXN]; int parent[MAXN][LOG]; int diff[MAXN]; int val[MAXN]; // 预处理深度和倍增祖先 void dfs_lca(int u, int p) { depth[u] depth[p] 1; parent[u][0] p; for (int i 1; i LOG; i) { parent[u][i] parent[parent[u][i-1]][i-1]; } for (int v : tree[u]) { if (v p) continue; dfs_lca(v, u); } } // 查询 LCA int lca(int u, int v) { if (depth[u] depth[v]) swap(u, v); int diff_depth depth[u] - depth[v]; for (int i 0; i LOG; i) { if (diff_depth i 1) { u parent[u][i]; } } if (u v) return u; for (int i LOG-1; i 0; i--) { if (parent[u][i] ! parent[v][i]) { u parent[u][i]; v parent[v][i]; } } return parent[u][0]; } // 点差分更新操作 void point_update(int u, int v, int c) { int l lca(u, v); diff[u] c; diff[v] c; diff[l] - c; if (parent[l][0] ! 0) { // 如果 l 不是根节点假设根为1 diff[parent[l][0]] - c; } } // 最终点权计算 DFS void dfs_calc(int u, int p) { for (int v : tree[u]) { if (v p) continue; dfs_calc(v, u); diff[u] diff[v]; } val[u] diff[u]; } int main() { int n, m; cin n m; // 建树 for (int i 1; i n; i) { int u, v; cin u v; tree[u].push_back(v); tree[v].push_back(u); } // 初始化点权假设初始为0 for (int i 1; i n; i) val[i] 0; // 预处理 LCA以1为根 depth[0] -1; dfs_lca(1, 0); // 执行 m 次点权更新操作 while (m--) { int u, v, c; cin u v c; point_update(u, v, c); } // 计算最终点权 dfs_calc(1, 0); // 输出结果 for (int i 1; i n; i) { cout val[i] ; } cout endl; return 0; }4. 应用场景与例题典型应用树上路径点权更新如“给树上一条路径的所有节点增加一个值”。多次更新后单点/全局查询所有更新操作完成后查询每个节点的最终点权。结合其他算法与树链剖分、树上启发式合并等结合解决更复杂问题。例题洛谷 P3128 [USACO15DEC] Max Flow题目大意给定一棵树有K次操作每次操作给定两个节点u, v将u到v路径上的所有点的点权加 1。所有操作完成后问点权最大的节点的点权是多少。这正是树上点差分的模板题。使用上述算法时间复杂度为O((NK) log N)LCA 预处理 O(N log N)每次更新 O(log N)。5. 时间复杂度分析预处理DFS 求深度和倍增数组O(N log N)。单次更新求 LCA O(log N)修改差分数组 O(1)。最终计算一次 DFS 还原点权O(N)。总复杂度O(N log N K log N N)通常简化为 O((NK) log N)。6. 总结树上点差分是将差分思想从线性序列推广到树形结构的经典算法它通过巧妙的差分标记将路径上的区间更新转化为常数次端点修改再通过一次 DFS 前缀和还原。掌握该算法需要理解差分数组diff[]的定义与物理意义。LCA 在确定路径端点影响范围时的关键作用。DFS 还原时差分值从子节点向父节点累加的过程。该算法是解决树上路径点权更新问题的利器也是学习树上边差分、树链剖分等高级技巧的重要基础。

相关新闻

别再写胶水代码了!用LangChain+AutoGen+自研Adapter实现AI工具智能路由(内部泄露版架构白皮书)

别再写胶水代码了!用LangChain+AutoGen+自研Adapter实现AI工具智能路由(内部泄露版架构白皮书)

更多请点击: https://intelliparadigm.com 第一章:AI 工具自动化衔接 AI 工具的自动化衔接正成为现代工程效能跃迁的关键支点。它并非简单地将多个 AI 服务串联调用,而是通过标准化协议、语义契约与可验证的数据流设计,实现模型能…

2026/10/16 1:39:07 阅读更多 →
3分钟上手Dify工作流:小白也能玩转的AI自动化神器

3分钟上手Dify工作流:小白也能玩转的AI自动化神器

3分钟上手Dify工作流:小白也能玩转的AI自动化神器 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dify-Work…

2026/10/16 1:39:40 阅读更多 →
ECDICT开源词典:150万词汇的免费中英文词典数据库终极指南

ECDICT开源词典:150万词汇的免费中英文词典数据库终极指南

ECDICT开源词典:150万词汇的免费中英文词典数据库终极指南 【免费下载链接】ECDICT Free English to Chinese Dictionary Database 项目地址: https://gitcode.com/gh_mirrors/ec/ECDICT 在语言学习和软件开发领域,一个高质量的词典数据库往往是提…

2026/10/15 16:53:43 阅读更多 →

最新新闻

LabVIEW与VisionPro集成实战:从.NET直调到C#中间层方案

LabVIEW与VisionPro集成实战:从.NET直调到C#中间层方案

搞机器视觉集成这些年,"用LabVIEW做流程控制、拿VisionPro干算法活"的组合,我在不止一个项目里见过。LabVIEW 2020的图形化开发环境做交互界面、运动控制和数据流逻辑确实顺手,但真要处理复杂的视觉检测、精密定位、多模板匹配&…

2026/10/18 5:40:42 阅读更多 →
【基于 Swoole+Hyperf 的微服务实战】第十一周·周二:构建异步日志采集与分析系统

【基于 Swoole+Hyperf 的微服务实战】第十一周·周二:构建异步日志采集与分析系统

【基于 SwooleHyperf 的微服务实战】第十一周周二:构建异步日志采集与分析系统今天我们进入第十一周周二,继续构建异步日志采集与分析系统。昨天我们实现了日志接收服务,将日志投递到 Kafka。今天要打造系统的消费与存储能力:编写…

2026/10/18 5:40:42 阅读更多 →
nuScenes数据集深入解析:多模态自动驾驶数据读取与坐标系变换

nuScenes数据集深入解析:多模态自动驾驶数据读取与坐标系变换

简介:面向自动驾驶研究与开发者,这份代码包围绕nuScenes数据集的下载、安装与可视化分析展开,完整梳理了1000个复杂场景、40万关键帧、140万相机图、1400万3D标注框以及多传感器配置和23类目标对象的处理逻辑,可帮助中高级算法工程…

2026/10/18 5:40:42 阅读更多 →
LabelImg 目标检测标注工具安装使用与VOC转YOLO实战

LabelImg 目标检测标注工具安装使用与VOC转YOLO实战

简介:LabelImg 是一款基于 Python Qt 开发的开源目标检测标注工具,本教程 PDF 面向机器学习初学者、算法工程师及数据标注人员,旨在解决目标检测任务中训练数据难以快速准备的问题。文档从环境要求讲起,给出使用清华源安装 label…

2026/10/18 5:40:42 阅读更多 →
x64dbg字符串搜索:逆向调试中的精准定位与实战技巧

x64dbg字符串搜索:逆向调试中的精准定位与实战技巧

做逆向调试,拿到一个陌生程序,很多人的第一反应是跟API、翻反汇编,绕来绕去半小时找不到北。我的习惯恰恰相反——先搜字符串。字符串是程序跟用户“说话”的痕迹,也是开发者留在代码里的路标。x64dbg里的字符串搜索功能&#xff…

2026/10/18 5:40:42 阅读更多 →
栈实现综合计算器:双栈分工与优先级处理详解

栈实现综合计算器:双栈分工与优先级处理详解

栈这个结构,很多人学的时候觉得简单,不就是后进先出嘛,拿个数组或者链表模拟一下,push、pop 一写就完事了。但真到了要拿它解决一个稍微像样点的问题,比如做一个能算加减乘除、带括号、还能处理多位数的计算器&#xf…

2026/10/18 5:39:42 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →