树上序列

版权声明:小蒟蒻的博客转载也请注明出处哦 https://blog.csdn.net/qq_42835823/article/details/82953207

dfs序(一棵树被dfs 时所经过的节点的顺序)

一般的作用是维护子树信息,如果记录dfni 表示i 号点的dfs 序,sizei
表示i 号点的子树大小,那么x 是y 的祖先等价于:
dfny ∈(dfnx,dfnx + sizex - 1];

维护一棵树,支持:子树加,链加,单点求值

因为是dfs序,所有子树的序号一定是连续的。
所以子树加相当于区间加。(T1)
而链加相当于单点加:(T2)
设u到v加w,那么u+w, v+w, lca(u,v)-w, fa[lca(u,v)]-w.
对于单点求值就是 T1的单点求值+T2的区间求和(这个点的这棵子树)。

维护一棵树,支持:子树加,链加,子树求和

子树加,相当于 dfs 序列上的区间加。
链加,看作一个点到根上的路径加。
一个修改 (x,W) 对 y 有贡献当且仅当 y 为 x 的祖先。
且贡献为(depx − depy + 1) ∗W。
分离变量,即为 depx ∗W+ (1 − depy) ∗W。
维护三个区间和即可。
1.子树加,子树求和(区间加,区间求和)。
2.单点加,子树(区间)求和,维护depx ∗W。
3.单点加,子树(区间)求和,维护W。

维护一棵树,支持:单点加,链求和。

对单点所在的子树区间加。
设求u到v这条链的值(单点求值)
ans=ask(u)+ask(v)-ask(lca(u,v))-ask(fa[lca(u,v)]);

维护一棵树,支持:子树加,链求和。

链求和,看作一个点到根上的路径求和。
一个修改 (x,W) 对 y 有贡献当且仅当 x 为 y 的祖先,
且贡献为(depy − depx + 1) ∗W。
分离变量,即为 (depy + 1) ∗W− depx ∗W。
维护两个区间和即可。
1子树(区间)加,单点求值,维护W。
2子树(区间)加,单点求值,维护depx ∗W。

维护一棵树,支持:子树加,链加,链求和。

子树加,链求和见上。下面处理链加,链求和。
(x,W) 对 y 的贡献分开讨论:
若 x 为 y 的祖先,那么贡献为 depx ∗W。
若 y 为 x 的祖先,那么贡献为 depy ∗W
分开维护贡献即可。

。:.゚ヽ(。◕‿◕。)ノ゚.:。+゚

猜你喜欢

转载自blog.csdn.net/qq_42835823/article/details/82953207