Splay50pts,求助

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

a_bottle @ 2020-04-21 15:26:05

rt

参考的代码

蒟蒻的提交记录

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int x=0,q=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')q=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=(x<<3)+(x<<1)+ch-'0';
        ch=getchar();
    }
    return q*x;
}
struct Splay
{
    int siz,num,fa,cnt;
    int son[2];
}t[2000001];
int n,m,last,root,tot,ans;
const int inf=2147483647;
inline void maintain(int x)
{
    t[x].siz=t[t[x].son[0]].siz+t[t[x].son[1]].siz+t[x].cnt;
}
inline void rotate(int x)
{
    int y=t[x].fa,z=t[y].fa;
    int w=(t[y].son[1]==x);
    t[z].son[t[z].son[1]==y]=x;
    t[x].fa=z;
    t[y].son[w]=t[x].son[w^1];
    t[t[y].son[w]].fa=y;
    t[x].son[w^1]=y;
    t[y].fa=x;
    maintain(y);
    maintain(x);
}
inline void splay(int x,int to)
{
    while(t[x].fa!=to)
    {
        int y=t[x].fa,z=t[y].fa;
        if(z!=to)
        {
            if((x==t[y].son[0])^(y==t[z].son[0]))
            rotate(x);
            else
            rotate(y);
        }
        rotate(x);
    }
    if(to==0)
    root=x;
}
inline void find(int x)
{
    int p=root;
    if(!p)return;
    while(t[p].son[x>t[p].num]&&x!=t[p].num)
    p=t[p].son[x>t[p].num];
    splay(p,0);
}
inline void insert(int x)
{
    int p=root,ff=0;
    while(p&&t[p].num!=x)
    {
        ff=p;
        p=t[p].son[x>t[p].num];
    }
    if(p)t[p].cnt++;
    else
    {
        p=++tot;
        if(ff)
        t[ff].son[x>t[ff].num]=p;
        t[p].fa=ff;
        t[p].son[0]=t[p].son[1]=0;
        t[p].siz=1;
        t[p].num=x;
        t[p].cnt=1;
    }
    splay(p,0);
}
inline int rk(int x)
{
    find(x);
    if(t[root].num<x)
    return t[t[root].son[0]].siz+1;
    else
    return t[t[root].son[0]].siz;
}
inline int kth(int x)
{
    int p=root;
    if(t[p].siz<x)return 0;
    while(1)
    {
        int y=t[p].son[0];
        if(x>t[y].siz+t[p].cnt)
        {
            x-=(t[y].siz+t[p].cnt);
            p=t[p].son[1];
        }
        else
        {
            if(t[y].siz>=x)
            p=y;
            else
            {
                splay(p,0);
                return t[p].num;
            }
        }
    }
}
inline int nxt(int x,int f)
{
    find(x);
    int p=root;
    if(t[p].num>x&&f)return p;
    if(t[p].num<x&&!f)return p;
    p=t[p].son[f];
    while(t[p].son[f^1])
    p=t[p].son[f^1];
    splay(p,0);
    return p;
}
inline void del(int x)
{
    int y=nxt(x,0);
    int z=nxt(x,1);
    splay(y,0);
    splay(z,y);
    int u=t[z].son[0];
    if(t[u].cnt>1)
    {
        t[u].cnt--;
        splay(u,0);
    }
    else
    {
        t[z].son[0]=0;
        splay(z,0);
    }
}
int main()
{
    n=read();
    m=read();
    insert(inf);
    insert(-inf);
    for(register int i=1;i<=n;i++)
    {
        int an;
        an=read();
        insert(an);
    }
    while(m--)
    {
        int opt,x;
        opt=read();
        x=read();
        x^=last;
        if(opt==1)
        {
            insert(x);
        }
        if(opt==2)
        {
            del(x);
        }
        if(opt==3)
        {
            last=rk(x);
            ans^=last;
        }
        if(opt==4)
        {
            last=kth(x+1);
            ans^=last;
        }
        if(opt==5)
        {
            last=t[nxt(x,0)].num;
            ans^=last;
        }
        if(opt==6)
        {
            last=t[nxt(x,1)].num;
            ans^=last;
        }
    }
    cout<<ans<<endl;
    return 0;
}

by oisdoaiu @ 2020-04-21 15:36:33

可能是前驱后继写错了?

我没看过这种写法


by oisdoaiu @ 2020-04-21 15:36:38

@a_bottle


by oisdoaiu @ 2020-04-21 15:40:07

您可以写个对拍造造小数据,这种数据结构题看代码也就自己能看懂自己的代码QAQ


by a_bottle @ 2020-04-22 12:11:53

@oisdoaiu 拿这个代码交了一下原题,发现玄学过了。

有什么特别蠢的原因会导致这样吗


by oisdoaiu @ 2020-04-22 14:13:28

@a_bottle 那就很可能是您处理强制在线的时候出了些小问题,或者是原题数据太水虽然不可能,但是你可以试试全局longlong


by a_bottle @ 2020-04-22 14:47:01

@oisdoaiu 全局longlong不行啊QAQ


by oisdoaiu @ 2020-04-22 14:52:49

@a_bottle 如果强制在线没错的话,那就只能是原题太水了怪不得要加强,您多看看强制在线吧


by oisdoaiu @ 2020-04-22 14:53:22

如果强制在线没错,就只能对拍了


by a_bottle @ 2020-04-22 15:02:48

@oisdoaiu 好吧谢谢大佬


|