dfs序七个经典问题[转]
dfs序七个经典问题 参考自:《数据结构漫谈》-许昊然 dfs序是树在dfs先序遍历时的序列,将树形结构转化成序列问题处理。 dfs有一个很好的性质:一棵子树所在的位置处于一个连续区间中。 ps:deep[x]为x的深度,l[x]为dfs序中x的位置,r[x]为dfs序中x子树的结束位置 1.点修改,子树和查询 在dfs序中,子树处于一个连续区间中。所以这题可以转化为:点修改,区间查询。用树状数组或线段树即可。 2.树链修改,单点查询 将一条树链x,y上的所有点的权值加v。这个问题可以等价为: 1).x到根节点的链上所有节点权值加v。 2).y到根节点的链上所有节点权值加v。 3).lca(x,y)到根节点的链上所有节点权值和减v。 4).fa(lca(x,y))到根节点的链上所有节点权值和减v。 上面四个操作可以归结为:节点x到根节点链上所有节点的权值加减v。修改节点x权值,当且仅当y是x的祖先节点时,x对y的值有贡献。 所以节点y的权值可以转化为节点y的子树节点贡献和。从贡献和的角度想:这就是点修改,区间和查询问题。 修改树链x,y等价于add(l[x],v),add(l[y],v),add(l[lca(x,y)],-v),add(l[fa(lca(x,y))],-v)。 查询:get_sum(r[x])-get_sum(l[x]