30pts 萌新求助Splay!!!

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

Surget @ 2021-08-21 16:30:12

只过了 #1,#3和#4 其它的是WA和TLE

#include<cstdio>
#include<iostream>
using namespace std;
int n,root,tot,m;
int last=0,ans=0;
struct str
{
    int son[2],cnt,f,value,size;
}t[1919810];
void rotate(int x)
{
    int fa=t[x].f,gfa=t[fa].f;
    int k=(t[fa].son[1]==x)?1:0;
    t[gfa].son[t[gfa].son[1]==fa?1:0]=x;
    t[x].f=gfa;
    t[fa].son[k]=t[x].son[k^1];
    t[t[x].son[k^1]].f=fa;
    t[x].son[k^1]=fa;
    t[fa].f=x;
    t[fa].size=t[t[fa].son[1]].size+t[t[fa].son[0]].size+t[fa].cnt;
    t[x].size=t[t[x].son[1]].size+t[t[x].son[0]].size+t[x].cnt;
}
void splay(int x,int r)
{
    while(t[x].f!=r)
    {
        int fa=t[x].f,gfa=t[fa].f;
        if(gfa!=r)
        (t[gfa].son[0]==fa)^(t[fa].son[0]==x)?rotate(x):rotate(fa);
        rotate(x);
    }
    if(r==0) root=x;
}
void find(int x) 
{
    int k=root;
    if(!k) return;
    while(t[k].son[x>t[k].value?1:0]&&x!=t[k].value)
    k=t[k].son[x>t[k].value?1:0];
    splay(k,0);
}
void insert(int x)
{
    int k=root,fa=0;
    while(k&&t[k].value!=x)
    {
        fa=k;
        k=t[k].son[x>t[k].value?1:0];
    }
    if(k) t[k].cnt++;
    else
    {
        k=++tot;
        if(fa) t[fa].son[x>t[fa].value?1:0]=tot;
        t[tot].son[0]=t[tot].son[1]=0;
        t[tot].f=fa;
        t[tot].value=x;
        t[tot].cnt=1;
        t[tot].size=1;
    }
    splay(k,0);
}
int next(int x,int s)
{
    find(x);
    int k=root;
    if(t[k].value>x&&s) return k;
    if(t[k].value<x&&!s) return k;
    k=t[k].son[s];
    while(t[k].son[s^1]) k=t[k].son[s^1];
    return k;
}
void del(int x)
{
    int la=next(x,0),ne=next(x,1);
    splay(la,0),splay(ne,la);
    int k=t[ne].son[0];
    if(t[k].cnt>1)
    {
        t[k].cnt--;
        splay(k,0);
    }
    else t[ne].son[0]=0;
}
int query(int x)
{
    int k=root;
    if(t[k].size<x) return 0;
    while(1)
    {
        int lson=t[k].son[0],rson=t[k].son[1],sum=t[lson].size+t[k].cnt;
        if(x>sum)
        {
            x-=sum;
            k=rson;
        }
        else
        {
            if(t[lson].size>=x) k=lson;
            else
            {
                splay(k,0);
                return t[k].value;
            }
        }
    }
}
signed main()
{
    scanf("%d%d",&n,&m);
    insert(0x7fffffff);
    insert(-0x7fffffff);
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        insert(x);
    }
    while(m--)
    {
        int opt,x;
        scanf("%d%d",&opt,&x);
        x^=last;
        if(opt==1) insert(x);
        if(opt==2) del(x);
        if(opt==3)
        {
            find(x);
            last=t[t[root].son[0]].size+1;
            ans^=last;
        }
        if(opt==4) last=query(x+1),ans^=last;
        if(opt==5) last=t[next(x,0)].value,ans^=last;
        if(opt==6) last=t[next(x,1)].value,ans^=last;
    }
    printf("%d",ans);
    return 0;
}

求助/kk


by ppip @ 2021-08-29 19:47:50

@Surget Cu Ball


|