BTS样例过了,全wa,求大佬看看
查看原帖
BTS样例过了,全wa,求大佬看看
581442
raymonds楼主2022/10/1 16:23
#include<iostream>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<cmath>
using namespace std;

struct node
{
    int val=0;
    int l=0;
    int r=0;
    int cnt=0;
    int siz=0;
}a[10002];
int q,Nsum;

int preNode(int x,int val,int ans=(-2147483647))  //寻找val值节点的前驱节点(比val小中的最大值)
{
    if(a[x].val>=val)
    {
        if(a[x].l)
            return preNode(a[x].l,val,ans);
        else
            return ans;
    }
    else
    {
        if(a[x].r)
        {
            if(a[x].cnt)
                return preNode(a[x].r,val,a[x].val);
            else
                return preNode(a[x].r,val,ans);
        }
        else
            return a[x].val;
    }
}
int aftNode(int x,int val,int ans=2147483647)  //寻找val值节点的后继节点(比val大中的最小值)
{
    if(a[x].val<=val)
    {
        if(a[x].r)
            return aftNode(a[x].r,val,ans);
        else
            return ans;
    }
    else
    {
        if(a[x].l)
        {
            if(a[x].cnt)
                return aftNode(a[x].l,val,a[x].val);
            else
                return aftNode(a[x].l,val,ans);
        }
        else
            return a[x].val;
    }
}
int rank_val(int x,int rk)  //寻找排名为rk的节点的val值
{
    if(!x)
        return 0;
    int res=a[x].cnt;
    if(a[x].l)
    {
        if(a[a[x].l].siz>rk)
            return rank_val(a[x].l,rk);
        else
            res+=a[a[x].l].siz;
    }
    if(res>=rk || !a[x].r)
        return a[x].val;
    else
        return rank_val(a[x].r,rk-res);
}
int _rank(int x,int val)  //寻找树中小于val值的节点数量
{
    if(!x)
        return 0;
    if(a[x].val==val)
    {
        if(a[x].l)
            return a[a[x].l].siz;
        else
            return 0;
    }
    else if(a[x].val>val)
    {
        if(a[x].l)
            return _rank(a[x].l,val);
        else
            return 0;
    }
    else
    {
        int res=a[x].cnt;
        if(a[x].l)
            res+=a[a[x].l].siz;
        if(a[x].r)
            res+=_rank(a[x].r,val);
        return res;
    }
}
void add(int x,int val)  //插入val值节点
{
    a[x].siz++;
    if(a[x].val==val)
        a[x].cnt++;
    else if(a[x].val<val)
    {
        if(a[x].r)
            add(a[x].r,val);
        else
        {
            Nsum++;
            a[Nsum].val=val;
            a[Nsum].cnt=1;
            a[Nsum].siz=1;
            a[x].r=Nsum;
        }       
    }
    else
    {
        if(a[x].l)
            add(a[x].l,val);
        else
        {
            Nsum++;
            a[Nsum].val=val;
            a[Nsum].cnt=1;
            a[Nsum].siz=1;
            a[x].l=Nsum;
        } 
    }
}

int main()
{
    cin>>q;
    int op,x;
    for(int i=0;i<q;i++)
    {
        cin>>op>>x;
        switch(op)
        {
            case 1:
                cout<<_rank(1,x)+1<<endl;
                break;
            case 2:
                if(x>Nsum)
                    cout<<0x7fffffff<<endl;
                else
                    cout<<rank_val(1,x)<<endl;
                break;
            case 3:
                cout<<preNode(1,x)<<endl;
                break;
            case 4:
                cout<<aftNode(1,x)<<endl;
                break;
            case 5:
                if(!Nsum)
                {
                    Nsum++;
                    a[Nsum].val=x;
                    a[Nsum].cnt=1;
                    a[Nsum].siz=1;
                }
                else
                    add(1,x);
                break;
            default:
                break;
        }
    }
    return 0;
}
2022/10/1 16:23
加载中...