dsu on tree
例题简述:在线维护一个森林(无向有权),每次操作可能是加一条边或是查询u->v的路径长度
首先,u->v路径的求法显然是lca,但是如果我们对于每一个连边操作都重新dfs一次新的联通块,那么我们的复杂度在最坏情况下有可能退化到n!这是我们不能接受的
我们仔细思考一下会发现,在被连接的两个联通快中,有一个联通块内的dis,f两个关键的数组是不会改变的
对于连边x->y,设他们的scc分别是xx,yy,siz[x]<siz[y].所以我们可以每次连边时将x的父亲定为y,将xx的scc定为yy,然后将x做为整个xx的根,然后重新将整个联通快重新dfs一遍
听起来还是很暴力对吗?,其实不然,我们可以思考一下每次合并两个联通块时,最坏的情况是两个联通块的大小相等,此时我们的时间复杂度是nlogn的