1.Dfs序的一些奇奇怪怪的操作和改进
所谓dfs序,就是一棵树被 dfs 时所经过的节点的顺序。一般的作用是维护子树信息,如果记录 dfn[i] 表示 i 号点的 dfs 序,sze[i]表示 i 号点的子树大小,那么 x 是 y 的祖先等价于:dfn[y] ∈ [dfn[x], dfn[x]+sze[x]−1]
那么我们就可以利用dfs序来进行一些树上的操作:
1.维护一棵树,支持:子树加,链加,单点求值。
对于子树加,相当于是 dfs 序列上的区间加。
对于链加,可以看作是一个点到根上的路径加。
可以把这次的修改放到这个点上,然后单点查询的时候在子树内区间询问贡献。
2.维护一棵树,支持:子树加,链加,子树求和。
对于子树加,相当于是 dfs 序列上的区间加。
对于链加,可以看作是一个点到根上的路径加。
一个修改 (x,W) 对 y 有贡献当且仅当 y 为 x 的祖先。且贡献为(dep[x]−dep[y]+1)∗W。
分离变量,即为dep[x]∗W+(1−dep[y])∗W。
所以维护两个区间和就行了。
3.维护一棵树,支持:单点加,链求和。
对于链求和,可以看作是一个点到根上的路径求和。
一个修改 (x,W) 对 y 有贡献当且仅当 x 为 y 的祖先。
相当于支持区间加,单点求值。
4.维护一棵树,支持:子树加,链求和。