啊我裂裂裂裂裂裂裂开了,splay被卡

P6136 【模板】普通平衡树(数据加强版)

绝顶我为峰 @ 2020-02-27 16:16:17

qaq

这题splay可以过吗qaq

我怎么50分卡掉了

加了快读qaq

#include<iostream>
#include<cstdio>
using namespace std;
#define int long long
int ans,a[100001],m,n,tot,rt,last,fa[1100001],ch[1100001][2],cnt[1100001],val[1100001],sz[1100001];
inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
            f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}
inline void maintain(int x)
{
    sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+cnt[x];
}
inline bool get(int x)
{
    return x==ch[fa[x]][1];
}
inline void clear(int x)
{
    fa[x]=ch[x][0]=ch[x][1]=cnt[x]=val[x]=sz[x]=0;
}
inline void rotate(int x)
{
    int y=fa[x],z=fa[y],k=get(x);
    ch[y][k]=ch[x][k^1];
    fa[ch[x][k^1]]=y;
    ch[x][k^1]=y;
    fa[y]=x;
    fa[x]=z;
    if(z)
        ch[z][y==ch[z][1]]=x;
    maintain(y);
    maintain(x);
}
inline void splay(int x)
{
    for(register int f=fa[x];f=fa[x],f;rotate(x))
        if(fa[f])
            rotate(get(x)==get(f)? f:x);
    rt=x;
}
inline void insert(int k)
{
    if(!rt)
    {
        val[++tot]=k;
        cnt[tot]=1;
        rt=tot;
        maintain(rt);
        return;
    }
    int node=rt,f=0;
    while(1)
    {
        if(val[node]==k)
        {
            ++cnt[node];
            maintain(node);
            maintain(f);
            splay(node);
            return;
        }
        f=node,node=ch[node][k>val[node]];
        if(!node)
        {
            val[++tot]=k;
            cnt[tot]=1;
            ch[f][k>val[f]]=tot;
            fa[tot]=f;
            maintain(tot);
            maintain(f);
            splay(tot);
            return;
        }
    }
}
inline int rk(int k)
{
    int res=0,node=rt;
    while(1)
    {
        if(k<val[node])
            node=ch[node][0];
        else
        {
            res+=sz[ch[node][0]];
            if(k==val[node])
            {
                splay(node);
                return res+1;
            }
            res+=cnt[node];
            node=ch[node][1];
        }
    }
}
inline int kth(int k)
{
    int node=rt;
    while(1)
    {
        if(ch[node][0]&&k<=sz[ch[node][0]])
            node=ch[node][0];
        else
        {
            k-=sz[ch[node][0]]+cnt[node];
            if(k<=0)
            {
                splay(node);
                return val[node];
            }
            node=ch[node][1];
        }
    }
}
inline int pre()
{
    int node=ch[rt][0];
    while(ch[node][1])
        node=ch[node][1];
    return node;
}
inline int nxt()
{
    int node=ch[rt][1];
    while(ch[node][0])
        node=ch[node][0];
    return node;
}
inline void del(int k)
{
    rk(k);
    if(cnt[rt]>1)
    {
        --cnt[rt];
        maintain(rt);
        return;
    }
    if(!ch[rt][0]&&!ch[rt][1])
    {
        clear(rt);
        rt=0;
        return;
    }
    if(!ch[rt][0])
    {
        rt=ch[rt][1];
        clear(fa[rt]);
        fa[rt]=0;
        return;
    }
    if(!ch[rt][1])
    {
        rt=ch[rt][0];
        clear(fa[rt]);
        fa[rt]=0;
        return;
    }
    int p=pre(),node=rt;
    splay(p);
    ch[rt][1]=ch[node][1];
    fa[ch[rt][1]]=rt;
    clear(node);
    maintain(rt);
}
signed main()
{
    n=read(),m=read();
    for(register int i=1;i<=n;++i)
    {
        a[i]=read();
        insert(a[i]);
    }
    while(m--)
    {
        int opt,k;
        opt=read(),k=read();
        k^=last;
        if(opt==1)
            insert(k);
        if(opt==2)
            del(k);
        if(opt==3)
        {
            insert(k);
            last=rk(k);
            del(k);
            ans^=last;
        }
        if(opt==4)
        {
            last=kth(k);
            ans^=last;
        }
        if(opt==5)
        {
            insert(k);
            last=val[pre()];
            ans^=last;
            del(k);
        }
        if(opt==6)
        {
            insert(k);
            last=val[nxt()];
            ans^=last;
            del(k);
        }
    }
    printf("%lld\n",ans);
    return 0;
}

by 绝顶我为峰 @ 2020-02-27 22:25:35

@谦谦君子 看前面有个人说他个人主页有


上一页 |