树上差分
算法详解
作用
区间修改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遍历每一个点求出改点被修改后实际权值即可
例题
进去后直接跳到第二题"小王子",不要看完整的题目(题面很长且不好理解要求什么)!!!