树上点差分算法详解
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/7/27 18:58:01 阅读更多 →
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/7/27 18:58:01 阅读更多 →
ECDICT开源词典:150万词汇的免费中英文词典数据库终极指南

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

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

2026/7/27 18:58:01 阅读更多 →

最新新闻

api2go源码解析:核心组件的设计思路与实现细节

api2go源码解析:核心组件的设计思路与实现细节

api2go源码解析:核心组件的设计思路与实现细节 【免费下载链接】api2go JSONAPI.org Implementation for Go 项目地址: https://gitcode.com/gh_mirrors/ap/api2go api2go是Go语言中实现JSONAPI.org规范的强大库,它提供了完整的RESTful API开发框…

2026/7/27 19:06:04 阅读更多 →
LyricsX终极指南:3分钟构建你的macOS智能歌词系统

LyricsX终极指南:3分钟构建你的macOS智能歌词系统

LyricsX终极指南:3分钟构建你的macOS智能歌词系统 【免费下载链接】LyricsX 🎶 Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX 还在为听歌时找不到准确歌词而烦恼吗?LyricsX作为macOS平台最强…

2026/7/27 19:06:04 阅读更多 →
5分钟快速上手:AMD Ryzen内存监控工具ZenTimings终极指南

5分钟快速上手:AMD Ryzen内存监控工具ZenTimings终极指南

5分钟快速上手:AMD Ryzen内存监控工具ZenTimings终极指南 【免费下载链接】ZenTimings 项目地址: https://gitcode.com/gh_mirrors/ze/ZenTimings 如果你正在使用AMD Ryzen平台,无论是游戏玩家、内容创作者还是超频爱好者,了解内存运…

2026/7/27 19:06:04 阅读更多 →
TTSFM WebSocket实时流式语音生成:从部署到测试完整教程

TTSFM WebSocket实时流式语音生成:从部署到测试完整教程

TTSFM WebSocket实时流式语音生成:从部署到测试完整教程 【免费下载链接】ttsfm TTSFM mirrors OpenAIs TTS service, providing a compatible interface for text-to-speech conversion with multiple voice options for free. 项目地址: https://gitcode.com/gh…

2026/7/27 19:06:04 阅读更多 →
FunASR语音识别:如何为听障人士打造实时字幕服务?

FunASR语音识别:如何为听障人士打造实时字幕服务?

FunASR语音识别:如何为听障人士打造实时字幕服务? 【免费下载链接】FunASR Open-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving. …

2026/7/27 19:06:04 阅读更多 →
3步搞定原神抽卡记录导出,让你的祈愿数据一目了然

3步搞定原神抽卡记录导出,让你的祈愿数据一目了然

3步搞定原神抽卡记录导出,让你的祈愿数据一目了然 【免费下载链接】genshin-wish-export Easily export the Genshin Impact wish record. 项目地址: https://gitcode.com/GitHub_Trending/ge/genshin-wish-export 你是否曾在原神抽卡时感到迷茫?…

2026/7/27 19:05:04 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻