解决问题:动态插入/删除边,维护splay可以进行维护的东西
1.普通的维护信息
建树:从i连向i+w
难点在于加边是单向的,故不支持换根
所以要改变link/cut的写法
link:保证图每时每刻都是森林,所以只有一个父亲,直接连边即可
cut:也是直接删边
答案是i到树根的经过节点,直接统计即可
2.判断是否联通
方法:将x设为树根,然后y连接树根,splay(y)后一直走左儿子,如果x在最左边的话就在一个联通块里,否则不是
反着来,删边->反着算建边
每次加边时候判断是否联通,若已经联通,在加入这条边令这两点直接所有边都是不必要的边
用并查集将他们缩点
答案是两点中间的点数-1
3.维护边权
将每一条边化为一个点即可
最常见用法是lct维护各种生成树,思路都是贪心连边,如果两点已经联通,贪心判断哪一条边好,否则直接加入即可
按照权值排序,从小到大加边
要最大值-最小值最小,所以每次加边时候如果是联通的就直接cut掉即可(最小尽量大),然后加边
4.维护子树信息
所有保持的信息都是虚拟子树上的
若想维护子树,需要开一些不变的信息(只有加边删边等操作会变)
要维护子树大小
加入一个维护的信息代表着除了现在的实儿子外的虚子树的大小
需要在加边和access(会改变儿子虚实)时候更新