阅读体验:https://www.zybuluo.com/Junlier/note/1228014
树上差分
数学方法——差分
啦啦啦~树上差分一点都不难(难的是天天爱跑步)
前置知识点
-
首先得知道差分这个东西吧! 简单差分
-
在讲树上差分之前,首先需要知道树的以下两个性质:
- 任意两个节点之间有且只有一条路径。
- 一个节点只有一个父亲节点(即只有一条返祖边)
-
可以发现所有树上两点(p,q)的路径可拆为:p--->lca(p,q)--->q
树上差分
最近考树上差分考得还挺多的
所以想要阿克的巨佬们最好学一下
像差分一样,树上差分也有前缀和思想
一个点的真实权值是一个点子树内所有差分后的权值之和(额,有点拗口没关系)
总的来说就是一个点的差分数组最后的值是整个子树内差分数组的和,再加进点的权值里
所以怎么差分呢
先抛出一个问题:给你m个操作,问你每次在(p,q)路径上给所有点的权值+1,问你最后点的权值情况(时间复杂度:请你尽量跑得快)
我们考虑差分,时刻记住上面的那句加粗的话
首先在p上面对差分数组+1,再在q上面对差分数组+1,在Lca(p,q)处对差分数组-1
我们根据上面所说的方法统计一遍子树差分数组和,就会发现正如所想
那么我们就可以推广到所有的情况了是吧
显然这样差分的修改复杂度是(O(logn))的(求Lca),只要最后再一边扫就是吧
你甚至可以Tarjan用求来优化掉每次修改的时候查的那个logn
如果需要代码板子的话可以看下面例题。。。
总结一下:
- 树上差分主要用于求解一些树上的路径问题
- 它通过利用树的一些性质,用一个差分数组来实现对一条路径的操作,这涉及到路径的 起,终点 与lca。
- 一般情况下:一个点的真实权值为其所在子树内所有点的差分数组的值的和
- 树上差分一般不适用于询问和操作嵌套的题目,这时一般用树链剖分解决
几道题:
luoguP3128 [USACO15DEC]最大流Max Flow 题解 板子题
luoguP3258 [JLOI2014]松鼠的新家 题解 板子题
luoguP2680 运输计划题解 题解 有难度
可以挑战一下天天爱跑步。。。