树链的并 学习笔记

做法

按dfn序排好序后,
所有点到根距离-所有相邻两点lca到根距离为树链的并总长

sort(que+1,que+n+1,cmp);
for(i=1;i<=n;i++) res+=dis[que[i]];
for(i=1;i<=n;i++) res-=dis[LCA(que[i],que[i+1])];

简略证明

如图:

dfn序为anc,x,y,z
求x,y,z树链的并:dis[anc]加3次减2次
求x,y,z,anc树链的并:dis[anc]加4次减3次(LCA(anc,x)=anc)

用途

可以树链的并求和
也可以树链的并修改
可以解决子树不同数问题

原文地址:https://www.cnblogs.com/acha/p/6287501.html