OI记忆口诀

splay_rotate:

inline void rotate(splay_node *x){
splay_node *y,*z;int d1,d2;
d1=get_parent(x,y);//三个结点扔过来同时统计d值
d2=get_parent(y,z);
if(y->ch[d1]=x->ch[d1^]) y->ch[d1]->fa=y;//y正x反y正爹
y->fa=x;x->fa=z;x->ch[d1^]=y;//yx,xz,x反y
if(d2!=-) z->ch[d2]=x;//d2非根z正x
y->update();//别忘y要update
return;
}

y正x反y正爹,yx、xz、x反y,d2非根z正x,别忘y要update。

splay_splay:

 inline splay_node * splay(splay_node *x){
pushdown(x);//上来别忘pushdown
while(){//循环走起带你飞
splay_node *y,*z;
int d1=get_parent(x,y);//d1是根我们break
if(d1==-) break;
int d2=get_parent(y,z);//d2是根rotate
if(d2==-){rotate(x);break;}
if(d1==d2) rotate(y),rotate(x);//如果相等就yx
else rotate(x),rotate(x);//如果不等就xx
} x->update();return x;//最后一定update ,把x记得扔回去
}
d1是根我们break,d2是根rotate,如果相等就yx,如果不等就xx,上来别忘pushdown,最后一定update。
上一篇:[bzoj]2962序列操作


下一篇:Ajax与C#应用详细实例