Splay指针模板

#include<cstdio>
#include<queue>
#include<cstdlib>
#define il inline
struct node
{
    int v;
    node* fa,ch[2];
}s[100045],*pos,*rt;
il void newnode(node* &r,int v,node* fa)
{
    if(mem.empty())
    r=pos++;
    else
    r=mem.front(),mem.pop();
    r->v=v;
    r->fa=fa;
    r->ch[0]=r->ch[1]=0;
}
il void roll(node* &r,boot t)
{
    node* y=r->fa;
    if(y->fa)
    y->fa->ch[y->fa->ch[1]==y]=x;
    fa[x]=y->fa;
    if(x->ch[t])
    x->ch[t]->fa=y;
    y->ch[!t]=x->ch[t];
    x->ch[p]=y;
    y->fa=x;
}
il void splay(node* r,node* g)//将r旋转到g下面 
{
    while(r->fa!=g) 
    {
        if(r->fa->fa==g)//如果r的爸爸的爸爸就是目标 
        roll(r,r->fa->ch[0]==x->fa);//转一下就可以了 
        else
        {//自行理解,很简单 
            node* y=x->fa;
            bool t=y->fa->ch[0]==y;
            if(y->ch[0]==x) 
            roll(y,t);
            else
            roll(x,!t);
            roll(x,t);
        }
    }
    if(!g)//目标没了,r当大爷 
    rt=r;
}

using namespace std;
int main()
{
    
}

 

转载于:https://www.cnblogs.com/gshdyjz/p/7207678.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值