30分代码求调,玄关xwx
查看原帖
30分代码求调,玄关xwx
563251
Cryflmind楼主2023/10/10 14:05
#include<bits/stdc++.h>
using namespace std;
#define INF 1E8
struct node{
    long long l=0,r=0,v=0,times=0;
    bool sets=false;
    long long ldeep=0,rdeep=0;
}p[10100]{};
long long top=0,q,op,x,maxn=-INF;

void debug()
{
    for(long long i=1;i<=10;i++)
    {
        printf("id:%lld\nl:%lld r:%lld\nv:%lld\ntimes:%lld\n\n",i,p[i].l,p[i].r,p[i].v,p[i].times);
    }
}
void insert(long long x,long pos) //low mid huge
{
    if(top==0){
        p[1].v=x;
        p[1].sets=true;
        p[1].times++;
        maxn=1;
        return;
    }
    if(x<p[pos].v)
    {
        //cout<<"debug point,into the <,now x="<<x<<",p[pos].v="<<p[pos].v<<endl;
        if(p[pos].l) { p[pos].ldeep++; insert(x,p[pos].l);}
        else{
            long long po=pos+1;
            while(p[po].sets) {
            po++;
            if(po>10010){
                po=2; //0 is NULL 1 is top
                }
            }
            maxn=max(maxn,po);
            p[pos].ldeep++;
            p[po].v=x;
            p[po].times++;
            p[pos].l=po;
            p[po].sets=true;
            return;
        }
    }
    else if(p[pos].v==x) {p[pos].times++; return;}
    else{
        if(p[pos].r) { p[pos].rdeep++; insert(x,p[pos].r);}
        else{
        //cout<<"debug point,into the else,now x="<<x<<",p[pos].v="<<p[pos].v<<endl;
            long long po=pos+1;
            while(p[po].sets) {
            po++;
            if(po>10010){
                po=2; //0 is NULL 1 is top
                }
            }
            maxn=max(maxn,po);
            p[pos].rdeep++;
            p[po].v=x;
            p[po].times++;
            p[pos].r=po;
            p[po].sets=true;
            return;
        }
    }
}

void search(long long x,long long pos,long long ans)
{
    if(top==0) {cout<<ans<<endl; return;}
    if(x>=p[pos].v)
    {
        if(p[pos].r&&x>p[p[pos].r].v) search(x,p[pos].r,ans+p[pos].ldeep+p[pos].times);
        else{ //x is lower than p[pos].r or p[pos].r is not exist
            if(x>p[pos].v) {cout<<ans+p[pos].ldeep+1<<endl; return;}
            else if(x==p[pos].v){ cout<<ans+p[pos].ldeep<<endl; return; }
        }
    }
    else {
        if(p[pos].l) search(x,p[pos].l,ans);
        else {cout<<ans<<endl; return;}
    }
}

void get_x(long long x,long long pos,long long cnt)
{
    if(p[pos].ldeep>x-cnt-1) get_x(x,p[pos].l,cnt);
    else if(p[pos].ldeep+p[pos].times>x-cnt-1) {cout<<p[pos].v<<endl; return;}
    else {get_x(x,p[pos].r,cnt+p[pos].ldeep+p[pos].times);}
}

void get_front(long long x,long long pos)
{
	long long ans=-INF;
	if(top<=1) {cout<<-2147483647<<endl; return;}
	for(long long i=1;i<=maxn;i++)
    {
        if(p[i].v<x)
        {
            ans=max(ans,p[i].v);
        }
    }
    if(ans==(long long)-INF) {cout<<-2147483647<<endl; return;}
    cout<<ans<<endl;
}

void get_back(long long x,long long pos)
{
    long long ans=INF;
	if(top<=1) {cout<<2147483647<<endl; return;}
	for(long long i=1;i<=maxn;i++)
    {
        if(p[i].v>x)
        {
            ans=min(ans,p[i].v);
        }
    }
    cout<<ans<<endl;
}

int main()
{
    cin>>q;
    for(long long i=1;i<=q;i++)
    {
        cin>>op>>x;
        switch(op)
        {
            case 1:
            {
                search(x,1,1);
                break;
            }
            case 2:
            {
                get_x(x,1,0);
                break;
            }
            case 3:
            {
                get_front(x,1);
                break;
            }
            case 4:
            {
                get_back(x,1);
                break;
            }
            case 5:
            {
                insert(x,1);
                top++;
                break;
            }
        }
        //if(x==9)
    //debug();
    }
    return 0;
}
2023/10/10 14:05
加载中...