splay

见洛谷日报

日报还是不错的,可以作为新手教学

第一步:旋转

 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     }
View Code
原文地址:https://www.cnblogs.com/shzyk/p/9741505.html