日报还是不错的,可以作为新手教学
第一步:旋转
1 void rotate(int x) 2 { 3 int y=fa[x];//父亲 4 int z=fa[y];//爷爷 5 int k=(son[y][1]==x);//x是y的左儿子(0) 右儿子(1) 6 son[z][(son[z][1]==y)]=x;//用x顶替y 7 fa[x]=z; 8 son[y][k]=son[x][k^1];//用x反儿子顶替x 9 fa[son[x][k^1]]=y; 10 son[x][k^1]=y;//y顶替x反儿子 11 fa[y]=x; 12 } 13 //det为0既把x旋至根节点 14 void splay(int x,int det) 15 { 16 while(fa[x]!=det) 17 { 18 int y=fa[x],z=fa[y]; 19 if(z!=det) //第一部操作 20 //等旋y 不等选x 21 (son[z][0]==y)^(son[y][0]==x)? rotate(x):rotate(y); 22 rotate(x);//选x 23 } 24 if(!det) rt=x; 25 }