14周学习总结

倍增法求最近公共祖先用处

1.求两点之间的树上距离:x的深度+y的深度-2*LCA(x,y)
2.倍增法求最近公共祖先是树上差分实现的基础,目的是为了求树上某一条边或者某一个点被被覆盖过的次数。
3.解决次小生成树问题。

树上差分

如果题目要求对树上的一段路径进行操作,并询问某个点或某条边被经过的次数,树上差分就可以派上用场了。这就是树上差分的基本操作。
树上差分,就是利用差分的性质,对路径上的重要节点进行修改(而不是暴力全改),作为其差分数组的值,最后在求值时,利用dfs遍历求出差分数组的前缀和,就可以达到降低复杂度的目的。
树上差分时需要求LCA.

点差分

设将两点u,v之间路径上的所有点权增加x,o=LCA(u,v),o的父亲节点为p,则操作如下:

diff[u]+=x,diff[v]+=x,diff[o]-=x,diff[p]-=x;

这样,只要dfs一遍,遍历时统计以每个节点为根的树的节点的权值和,就是当前节点的最终权值

边查分

设将两点u,v之间路径上的所有边权增加x,o=LCA(u,v),以每条边两端深度较大的节点存储该边的差分数组,则操作如下:

diff[u]+=x,diff[v]+=x,diff[o]-=2*x;

同样地,只要dfs一遍,遍历时统计以每个节点为根的树的节点的权值和,就是当前节点到父亲节点的边的最终权值了!

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页