lct这东西一不用就忘了,,,所以在此整理下
lct维护边双联通分量
这类题通常是在一颗树上不停加边,然后询问双联通性。
做法:
我们用并查集维护每个点所属的联通分量,出现联通分量时我们暴力地把这些点缩起来, 并查集指向同一祖先。void del(int x,int rt) { if(!x) return ; fa[x]=rt; del(T[x].son[0],rt);del(T[x].son[1],rt); }
这样据说操作次数是nlogn的(不会证明),复杂度是对的。
同时我们缩完点后删除的点所连的虚子树的fa也发生了改变,这个我们在access是更新。x=T[x].fa=getfa(T[x].fa);
例题:
luogu 2542 [AHOI2005]航线规划
bzoj 星球联盟
关于lct中维护连通性
bzoj 2959: 长跑给的教训:
不要用一直走左儿子的方法来判断是否在一个联通块中,复杂度不对。
可以在splay中维护深度最浅的点,一种更优秀的方法是用并查集。