简单复习一下树上差分的两种操作(边差分与点差分)

边差分

即快速统计出每条边在我们执行的操作中出现的次数。

s u m [ i ] sum[i] sum[i]表示 i i i号点到它的父亲的那条边出现的次数。

假设接下来我们对 x − > y x->y x>y这条路径执行了某个操作,需要修改这条路径上的每条边出现的次数。

我们只需要维护这条路径的两端与 l c a lca lca即可:

sum[x]++,sum[y]++,sum[lca(x,y)]-=2;

最后我们只需要从根节点开始遍历图就好了


点差分

与边差分类似,快速统计出每个点在我们执行的操作中出现的次数

s u m [ i ] sum[i] sum[i]表示 i i i号点出现的次数。

假设接下来我们对 x − > y x->y x>y这条路径执行了某个操作,需要修改这条路径上的每条边出现的次数。

我们只需要维护这条路径的两端与 l c a lca lca与之父亲即可:

sum[x]++,sum[y]++,sum[lca(x,y)]--,sum[fa[lca(x,y)][0]]--

最后依然遍历一遍图。

你可能感兴趣的:(其他-差分,备战NOIP2018)