splay被卡飞

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

JimmyFlower @ 2020-03-05 18:48:14

#6被卡了,但是我这个总耗时好像比其他的splay快。而且别的splay的#6都很快,在1s之内。???

#pragma GCC optimize("Ofast","-funroll-loops","-fdelete-null-pointer-checks")
#pragma GCC target("ssse3","sse3","sse2","sse","avx2","avx")
#include<cctype>
#include<cstdio>
#define ri register int
using namespace std;
int n,m,opt,x,ans=0,la=0;
int root=0,len=0;
struct splay{int d,n,s,f,son[2];}tr[1110000];
inline char gc()
{
    static char buf[1000000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
    ri x=0; register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);x=(x<<3)+(x<<1)+(c&15),c=gc());
    return x;
}
inline int get(int x){return tr[tr[x].f].son[1]==x;}
inline void update(int x)
{
    int lc=tr[x].son[0],rc=tr[x].son[1];
    tr[x].s=tr[lc].s+tr[rc].s+tr[x].n;
}
inline void add(int d,int f)
{
    len++;
    tr[len].d=d,tr[len].n=tr[len].s=1,tr[len].f=f,tr[len].son[0]=tr[len].son[1]=0;
    if(d<tr[f].d) tr[f].son[0]=len; else tr[f].son[1]=len;
}
inline void connect(int r,int R,int w)
{
    if(r) tr[r].f=R;
    tr[R].son[w]=r;
}
inline void rotate(int x)
{
    int w=get(x)^1;
    int f=tr[x].f,ff=tr[f].f;
    connect(tr[x].son[w],f,w^1);
    connect(x,ff,get(f));
    connect(f,x,w);
    update(f),update(x);
}
inline void splay(int x,int rt)
{
    for(ri f;(f=tr[x].f)!=rt;rotate(x))
        if(tr[f].f!=rt) rotate(get(x)==get(f)?f:x);
    if(rt==0) root=x;
}
inline int getip(int d)
{
    int x=root;
    while(tr[x].d!=d)
    {
        if(d<tr[x].d)
        {
            if(!tr[x].son[0]) break;
            x=tr[x].son[0];
        }
        else
        {
            if(!tr[x].son[1]) break;
            x=tr[x].son[1];
        }
    }
    return x;
}
inline void ins(int d)
{
    if(root==0){add(d,0),root=len;return;}
    int x=getip(d);
    if(tr[x].d==d) tr[x].n++,splay(x,0);
    else add(d,x),splay(len,0);
}
inline void del(int d)
{
    int x=getip(d); splay(x,0);
    if(tr[x].n>1){tr[x].n--,update(x);return;}
    if(!tr[x].son[0]&&!tr[x].son[1]) root=len=0;
    else if(!tr[x].son[0]&&tr[x].son[1]) root=tr[x].son[1],tr[root].f=0;
    else if(tr[x].son[0]&&!tr[x].son[1]) root=tr[x].son[0],tr[root].f=0;
    else
    {
        int p=tr[x].son[0];
        while(tr[p].son[1]) p=tr[p].son[1];
        splay(p,x);
        connect(tr[x].son[1],p,1);
        root=p,tr[p].f=0,update(p);
    }
}
inline int getrk(int d)
{
    int x=getip(d); splay(x,0);
    if(tr[x].d<d) return tr[tr[x].son[0]].s+tr[x].n+1;
    else return tr[tr[x].son[0]].s+1;
}
inline int kth(int k)
{
    int x=root;
    while(1)
    {
        int lc=tr[x].son[0],rc=tr[x].son[1];
        if(k<=tr[lc].s) x=lc;
        else if(k>tr[lc].s+tr[x].n) k=k-(tr[lc].s+tr[x].n),x=rc;
        else break;
    }
    splay(x,0);
    return tr[x].d;
}
inline int pre(int d)
{
    int x=getip(d); splay(x,0);
    if(d<=tr[x].d&&tr[x].son[0])
        for(x=tr[x].son[0];tr[x].son[1];x=tr[x].son[1]);
    return tr[x].d;
}
inline int nxt(int d)
{
    int x=getip(d); splay(x,0);
    if(tr[x].d<=d&&tr[x].son[1])
        for(x=tr[x].son[1];tr[x].son[0];x=tr[x].son[0]);
    return tr[x].d;
}
int main()
{
    n=read(),m=read();
    for(ri i=1;i<=n;i++) x=read(),ins(x);
    for(ri i=1;i<=m;i++)
    {
        opt=read(),x=read()^la;
        if(opt==1) ins(x);
        else if(opt==2) del(x);
        else if(opt==3) ans^=(la=getrk(x));
        else if(opt==4) ans^=(la=kth(x));
        else if(opt==5) ans^=(la=pre(x));
        else if(opt==6) ans^=(la=nxt(x));
    }
    printf("%d",ans);
    return 0;
}

by Dimly_dust @ 2020-03-05 18:49:04

抱歉,我看不懂。。。


by Dimly_dust @ 2020-03-05 18:49:21

太难了。。。。


by 7KByte @ 2020-03-05 18:52:26

@JimmyFlower 试试随机化(每100次操作随机Splay一个点


by ForgotMe @ 2020-03-05 18:56:00

应该是写丑了,我的Splay跑这道题时第6个点是最快的。。。


by PrincessQi @ 2020-03-05 18:56:07

@JimmyFlower 试试随机化?


by PrincessQi @ 2020-03-05 18:56:52

我#6是我最快的一个点


by JimmyFlower @ 2020-03-05 18:59:59

....淦我的耗时比一些AC的都要快1,2s,第6个点却被卡了


by PrincessQi @ 2020-03-05 19:02:37

你比我快2s


by Smile_Cindy @ 2020-03-05 19:19:47

@JimmyFlower getip那里要Splay吧,但是我加了Splay又WA又TLE,憋问我怎么办。


by Smile_Cindy @ 2020-03-05 19:20:19

好像你还有好几个地方没有splay


| 下一页