splay求调 悬关
查看原帖
splay求调 悬关
753757
paradise520楼主2024/4/30 22:24

WA on #7-#12

答案和1000行样例只差1个数QAQ

#include<iostream>
#include<algorithm>
using namespace std;
constexpr int N=1000010,INF=0x3f3f3f3f;
int n,op,x,root=0,idx;
struct node
{
    int p,s[2];
    int val,size,cnt;
}tr[N];
void clear(int u)//清空结点u  
{
    tr[u].p=tr[u].s[0]=tr[u].s[1]=0;
    tr[u].val=tr[u].size=tr[u].cnt=0;
}
void add(int u,int v,int p)//初始化结点  
{
    tr[u].val=v,tr[u].p=p;
    tr[u].size=tr[u].cnt=1;
}
void pushup(int u)
{
    tr[u].size=tr[tr[u].s[0]].size+tr[u].cnt+tr[tr[u].s[1]].size;
    return;
}
void rotate(int x)
{
    int y=tr[x].p,z=tr[y].p;
    int k= (tr[y].s[1]==x);
    tr[tr[x].s[k^1]].p=y,tr[y].s[k]=tr[x].s[k^1];
    tr[y].p=x,tr[x].s[k^1]=y;
    tr[x].p=z,tr[z].s[y==tr[z].s[1]]=x;
    pushup(y),pushup(x);
}
void splay(int x,int k)
{
    while(tr[x].p!=k)
    {
        int y=tr[x].p,z=tr[y].p;
        if(z!=k)
            if((x==tr[y].s[1])^(y==tr[z].s[1]))rotate(x);
            else rotate(y);
        rotate(x);
    }
    if(!k)root=x;
}
int get_pre()//找到根节点的前驱 
{
    int x=tr[root].s[0];
    while(tr[x].s[1])x=tr[x].s[1];
    return x;
}
int get_next()
{
    int x=tr[root].s[1];
    while(tr[x].s[0])x=tr[x].s[0];
    return x;
}
void insert(int v)
{
    int u=root,p=0;
    while(u)
    {
        p=u,u=tr[u].s[v>tr[u].val];
    }
    u=++idx;
    if(p)tr[p].s[v>tr[p].val]=u;
    add(u,v,p);
    splay(u,0);
}
int get_key_by_rank(int rank)//通过排名找数值  
{
    int u=root;
    while(true)
    {
        if(tr[u].s[0]&&tr[tr[u].s[0]].size>=rank)u=tr[u].s[0];
        else if(tr[tr[u].s[0]].size+tr[u].cnt>=rank)
        {
            return u;
        }
        else
        {
            rank=rank-tr[tr[u].s[0]].size-tr[u].cnt;
            u=tr[u].s[1];
        }
    }
}
int get_rank_by_key(int v)
{
    int u=root,ans=0;
    while(u)
    {
        if(tr[u].val>v)u=tr[u].s[0];
        else
        {
            if(tr[u].s[0])ans+=tr[tr[u].s[0]].size;
            if(tr[u].val==v)
            {
                splay(u,0);
                return ans+1;
            }
            ans+=tr[u].cnt;
            u=tr[u].s[1];
        }
    }
    return ans+1;
}
void remove(int x)//删除  
{
    get_rank_by_key(x);
    if(tr[root].cnt>1)
    {
        tr[root].cnt--;
        pushup(root);
        return;
    }
    if(!tr[root].s[0]&&!tr[root].s[1])
    {
        clear(root);
        root=0;
        return;
    }
    if(!tr[root].s[1])
    {
        int z=root;
        root=tr[root].s[0];
        tr[root].p=0;
        clear(z);
        return;
    }
    if(!tr[root].s[0])
    {
        int z=root;
        root=tr[root].s[1];
        tr[root].p=0;
        clear(z);
        return;
    }
    int pre=get_pre(),z=root;
    splay(pre,0);
    tr[root].s[1]=tr[z].s[1];
    tr[tr[root].s[1]].p=root;
    clear(z);
    pushup(root);
    return;
}
int main()
{
    cin>>n;
    while(n--)
    {
        cin>>op>>x;
        if(op==1)insert(x);
        else if(op==2)remove(x);
        else if(op==3)cout<<get_rank_by_key(x)<<"\n";
        else if(op==4)cout<<tr[get_key_by_rank(x)].val<<"\n";
        else if(op==5)
        {
            insert(x);
            cout<<tr[get_pre()].val<<"\n";
            remove(x);
        }
        else if(op==6)
        {
            insert(x);
            cout<<tr[get_next()].val<<"\n";
            remove(x);
        }
        else cout<<"Error_input\n";
    }
    return 0;
}
2024/4/30 22:24
加载中...