求调,过不了样例
查看原帖
求调,过不了样例
1263684
Elysialr楼主2024/11/3 18:35
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 2147483647

struct BST{
    ll lc,rc;
    ll val,cnt;
    ll size;
};

BST t[1000001];
ll tot,root;

ll add(ll val){
    tot++;
    t[tot].val=val;
    t[tot].size=1;
    t[tot].cnt=1;
    return tot;
}
void update(ll x){
    t[x].size=t[t[x].lc].size+t[t[x].rc].size+t[x].cnt;
}
void build(){
    t[++tot].val=-inf;
    t[++tot].val=inf;
    root=1;
    t[root].rc=2;
    update(root);
}
void insert(ll &x,ll val){
    if(x==0){
        x=add(val);
        return;
    }
    if(val==t[x].val) t[x].cnt++;
    if(val<t[x].val) insert(t[x].lc,val);
    if(val>t[x].val) insert(t[x].rc,val);
    update(x);
}
ll pos_val(ll val){
    ll x=root,ans=2;
    while(x!=0){
        if(val==t[x].val){
            if(t[x].rc>0){
                x=t[x].rc;
                while(t[x].lc>0)
                x=t[x].lc;
                ans=x;
            }
            break;
        }
        if(t[x].val>val&&t[x].val<t[ans].val) ans=x;
        if(val<t[x].val) x=t[x].lc;
        if(val>t[x].val) x=t[x].rc;
    }
    return t[ans].val;
}
ll pre_val(ll val){
    ll x=root,ans=1;
    while(x!=0){
        if(val==t[x].val){
            if(t[x].lc>0){
                x=t[x].lc;
                while(t[x].rc>0)
                x=t[x].rc;
                ans=x;
            }
            break;
        }
        if(t[x].val<val&&t[x].val>t[ans].val) ans=x;
        if(val<t[x].val) x=t[x].lc;
        if(val>t[x].val) x=t[x].rc;
    }
    return t[ans].val;
}
ll get_val(ll x,ll rank){
    if(x==0) return inf;
    if(t[t[x].lc].size>=rank) return get_val(t[x].lc,rank);
    if(t[t[x].lc].size+t[x].cnt>=rank) return t[x].val;
    return get_val(t[x].rc,rank-t[t[x].lc].size-t[x].cnt);
}
ll get_rank(ll x,ll val){
    if(x==0) return 1;
    if(val==t[x].val) return t[t[x].lc].size+1;
    if(val<t[x].val) return get_rank(t[x].lc,val);
    return get_rank(t[x].rc,val)+t[t[x].lc].size+t[x].cnt;
}

int main(){
    ll q;
    cin>>q;
    build();
    for(ll i=1;i<=q;i++){
        ll op,x;
        cin>>op>>x;
        if(op==5) insert(root,x);
        if(op==4) cout<<pos_val(x)<<endl;
        if(op==3) cout<<pre_val(x)<<endl;
        if(op==2) cout<<get_val(root,x)<<endl;
        if(op==1) cout<<get_rank(root,x)<<endl;
    }
    return 0;
}
2024/11/3 18:35
加载中...