splay模板

int update(int x)
{
    if (x==0)
        return 0;
    标记下传;
}
int son(int x)
{
    if (t[f[x]][0]==x)
        return 0;
    return 1;
}
int rotate(int x)
{
    int y=f[x],z=son(x);
    t[y][z]=t[x][1-z];
    if (t[x][1-z]!=0)
        f[t[x][1-z]]=y;
    f[x]=f[y];
    if (f[y]!=0)
        t[f[y]][son(y)]=x;
    f[y]=x,t[x][1-z]=y,update(y),update(x);
}
int down(int x)
{
    下传标记;
    清空;
}
int remove(int x,int y)
{
    do d[++d[0]]=x,x=f[x];while (x!=y);
    while (d[0])
        down(d[d[0]--]);
}
int splay(int x,int y)
{
    if (x==y)
        return 0;
    remove(x,y);
    while (f[x]!=y)
    {
        if (f[f[x]]!=y)
            if (son(f[x])==son(x))
                rotate(f[x]);
            else 
                rotate(x);
        rotate(x);
    }
    if (y==0)
        root=x;
}
int del(int x)
{
    shan[0]++,shan[shan[0]]=x;
    f[t[x][0]]=f[x];
    t[f[x]][0]=t[x][0];
    t[x][0]=0;
    update(f[x]);
}
int kth(int x,int k)//第k大
{
    if (b[t[x][0]].size+1==k)
        return x;
    if (b[t[x][0]].size+1>k)
        return kth(t[x][0],k);
    if (b[t[x][0]].size+1<k)
        return kth(t[x][1],k-b[t[x][0]].size-1);
}
void overturn(int x)//翻转
{
    if(!x)return;
    swap(tt[x][0],tt[x][1]);
    lazy[x]^=1;
}
int split(int x,int y,int &l,int &r)//分离
{
    int j=kth(x,y);
    splay(j,0);
    l=j,r=t[j][1];
    t[l][1]=0;
    f[r]=0;
    update(j);
}
int merge(int x,int y,int &l)//合并
{
    int j=kth(x,size[x]);
    splay(j,0);
    t[j][1]=y;
    f[y]=j;
    update(j);
    l=j;
}
int build(int l,int r,int y)
{
    if(l>r)return 0;
    int mid=(l+r)/2;
    int x=insert(a[mid]),f[x]=y;
    if(l==r)return x;
    t[x][0]=build(l,mid-1,x);
    t[x][1]=build(mid+1,r,x);
    update(x);
    return x;
}
root=build(0,n+1,0);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值