做法
按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)
用途
可以树链的并求和
也可以树链的并修改
可以解决子树不同数问题