一:
读入优化
inline int read()
{
int f=1,x=0;
char ch=getchar();
while (ch>‘9’||ch<‘0’) f=-1,ch=getchar();
while (ch>=‘0’&&ch<=‘9’) x=x10+ch-‘0’;
return f
x;
}

二:
字符串操作对比

char cmd[10];

if (cmd[0]==‘C’)//字符数组
//操作;

else if(cmd[0]=='D)
//操作;

else
//操作

2string s;
if (strcmp(s,“C”))//不知道是否可行,以后试试

三:
数据结构结构体写法
//以结构体为例
struct Lin-cut-Tree{
private:
struct Node{
}//结构体嵌套
对Node的操作;

normalize()//代表将某个平衡树的子树正常化,实际上是维护标记下传
leftrotate()//左旋操作
rightrotate()//右旋操作
splay()//splay操作
access()//基操,将v到根节点的路径上的所有边都变为实边,当然,为了保证实边,虚边划分的性质,一部分原来的实边也要相应变为虚边。注意该操作会将v下方的实边变为虚边。如图所示的是针对结点h的expose操作。
find_root()//寻找树根,我们只要对结点v执行access操作,便使得v与要找的根节点在同一颗平衡树中了。然后,要找的根节点一定是实路径的尾部,即平衡树中的最左结点。
evert()//该操作等价于将v到v所在树的根节点的路径上的所有边取反。首先执行access(v)操作,我们便已经将该条路径取出了。由于路径是用平衡树维护,所以需要执行的是平衡树的逆序。给平衡树结点用打标记的方式反序。这里由于是对整颗平衡树反序,所以标记应该打在平衡树的根节点处。用打标记的方式维护的时候,要对整颗平衡树的旋转等操作进行相应的维护。

cut() //首先将u置为有根树的根节点,从而保证v一定是u的子节点。再对v执行access操作,我们便将u和v合并到同一平衡树中了。此时对v执行splay操作使其成为所在平衡树的根节点,同时分离v和v的左子树,便完成了边的删除操作。

link()//为了保证连接后得到的树形态亦然合法(即为有根树),我们需要令u成为其所在树的根节点。我们将u变为其所在树的根节点,同时要将u用splay操作移动到其所在平衡树的根节点。此时,u的左子树必然为空。我们将v用splay操作移动到其所在平衡树的根节点,然后令u的左孩子为v,然后令u的左孩子为v,便完成了连接操作。

public:
对T的操作,极好的实现了封装

}
Lin-cut-Tree T;//建立了对象

在主函数中直接对对象进行操作
init()
T.Make_Tree()//建树
T.getRoot()//类似并查集方式,判断两树是否在同一个联通块中。
T.addEdge()//加边,u和v连边,与连通性相关
T.destroy()//摧毁边