树上差分
本人被树上差分困扰了很久!!今天正式来攻克一下。
快速回顾:差分和前缀和
考虑这样一个问题:给一个数列 ,初始时都是 ,要求支持以下两种操作:
-
给定 :让 增加 。
-
给定 :输出 。
先不要想什么线段树,有什么可以不暴力修改每个节点的方法吗?当然有!我们可以维护一个差分数组。修改 时,
-
让 。
-
让 。
要查询 时,我们就计算 的前缀和就好了。
什么是树上差分
树上差分解决这样的问题:
-
给定树上两个节点 和数 :让 这条路径上的计数器 。
-
和数列上的差分有些不同,这里应用的是 “子树和” 思想。同时又分为点差分和边差分两种。
点差分

图摘自 oi-wiki
如图,我们想要让路径 上的节点计数器 ,这样做:
-
,。(把端点的差分计数器 )
-
。(把 LCA 的差分计数器 )
-
。(把 LCA 的父节点的差分计数器 )
你可能会疑惑,那我们怎么获取,比如 的值呢?我们只要计算以 为顶点的子树的差分计数器之和就行了!!神奇!