树上差分

算法详解

作用

区间修改u到v最短路径上的点权或边权

做法

前置知识:LCA(很重要)

顾名思义,就是树上的差分,说了和没说一样

先把重要的摆在前面:

树上差分是自底向上的!!!自底向上的!!!自底向上的!!!

为什么呢?

先回忆一下差分:对于区间[l,r],每个数加上d,那么我们定义查分数组为dat,则dat[l]+=d,dat[r+1]-=d

一棵树,一个点有很多个子结点,但是只有一个父节点,如果我们自顶向下做差分以及前缀和,如果点u被修改了,以u为根的整颗子树都会被影响,要抵消影响,就要访问u的每一个子结点,就意味着还是不能做到O(1)修改,还不如暴力(还不能理解的自己想想或者写一写就知道了,其实我表达也不是很到位).但是,如果我们采用自底向上,被影响的只有u的祖先结点,很明显,是一条链的结构,我们只需访问u的某个祖先结点v就可以实现区间修改u到v最短路径上的数据.

如果u和v不存在祖先关系呢?LCA就要派上用场了,修改u到v的最短路径上dat值就是分别修改u到lca(u,v)和v到lca(u,v)的dat值(lca(u,v)必定在u到v的最短路径上)

最后通过dfs遍历每一个点求出改点被修改后实际权值即可

例题

进去后直接跳到第二题"小王子",不要看完整的题目(题面很长且不好理解要求什么)!!!

传送门

推一篇博客(写得真的很好)

传送门

原文地址:https://www.cnblogs.com/dream1024/p/13957859.html