30pts WBLT求调
查看原帖
30pts WBLT求调
756684
寄风孤影楼主2024/7/14 22:29

RT,WA #4,#6,#7,MLE #5,#8~#11,#13

Code:

#include <bits/stdc++.h>
using namespace std;
#define int long long
namespace WBLT{
    const int INF=1e14;
    int sz[100005<<1] , ls[100005<<1],rs[100005<<1] , val[100005<<1],bin[100005<<1],tp,rt;
    int cnt=0;
    constexpr double alpha=0.25;
    inline bool leaf(int p){
        return (!ls[p]||!rs[p]);
    }
    inline void pushup(int p){
        if(leaf(p)) return sz[p]=1,void();
        sz[p]=sz[ls[p]]+sz[rs[p]];
        val[p]=val[rs[p]];
    }
    inline int add(int s , int l ,int r,int v){
        int now=(tp>0?bin[tp--]:++cnt);
        sz[now]=s,ls[now]=l,rs[now]=r,val[now]=v;
        return now;
    }
    inline void del(int cnt){
        bin[++tp]=cnt;
    }
    inline int merge(int a , int b){
        int x;
        return add(sz[a]+sz[b],a,b,val[b]);
    }
    inline void rotate(int p , int fg){
        if(!fg){//左儿子旋转到右儿子
            int l=ls[ls[p]] , r=rs[ls[p]];
            del(ls[p]);
            ls[p]=l;
            rs[p]=merge(r,rs[p]);
            pushup(p);
        }
        else{//右儿子旋转到左儿子
            int l=ls[rs[p]] , r=rs[rs[p]];
            del(rs[p]);
            rs[p]=r;
            ls[p]=merge(ls[p],l);
            pushup(p);
        }
    }
    inline void upd(int p){
        if(leaf(p))return ;
        if(alpha<=sz[ls[p]]*1.0/sz[p]&&sz[ls[p]]*1.0/sz[p]<=1-alpha)return ;
        if(!(alpha<=sz[ls[p]]*1.0/sz[p])){//sz[ls[p]]<sz[rs[p]]
            double row=sz[ls[rs[p]]]*1.0/sz[rs[p]];
            if(row>=(1-2*alpha)/(1-alpha))rotate(rs[p],0);
            rotate(p,1);
        }
        else{//sz[ls[p]]>sz[rs[p]]
            double row=sz[ls[ls[p]]]*1.0/sz[ls[p]];
            if(row>=(1-2*alpha)/(1-alpha))rotate(ls[p],1);
            rotate(p,0);
        }
    }
    inline void init(){
        rt=add(1,0,0,INF);
    }
    inline void copy(int p1 , int p2){
        ls[p1]=ls[p2],rs[p1]=rs[p2],sz[p1]=sz[p2],val[p1]=val[p2];
    }
    inline void insert(int p , int v){
        if(leaf(p)) return ls[p]=add(1,0,0,min(val[p],v)),rs[p]=add(1,0,0,max(val[p],v)),pushup(p),upd(p),void();
        if(val[ls[p]]<v)insert(rs[p],v);
        else insert(ls[p],v);
        pushup(p),upd(p);
    }
    inline void insert(int v){
        insert(rt,v);
    }
    inline void erase(int p,int v,int fa){
        if(leaf(p)){
            if(ls[fa]==p)copy(fa,rs[fa]),del(ls[fa]);
            else if(rs[fa]==p)copy(fa,ls[fa]),del(rs[fa]);
            return ;
        }
        if(val[ls[p]]<v)erase(rs[p],v,p);
        else erase(ls[p],v,p);
        pushup(p),upd(p);
    }
    inline void erase(int v){
        erase(rt,v,-1);
    }
    inline int rnk(int p,int x){
        if(leaf(p))return 1;
        if(val[ls[p]]<x)return rnk(rs[p],x)+sz[ls[p]];
        return rnk(ls[p],x);
    }
    inline int rnk(int x){
        return rnk(rt,x);
    }
    inline int kth(int p,int x){
        if(sz[p]==x)return val[p];
        if(sz[ls[p]]<x)return kth(rs[p],x-sz[ls[p]]);
        return kth(ls[p],x);
    }
    inline int kth(int x){
        return kth(rt,x);
    }
    inline int pre(int x){
        return kth(rnk(x)-1);
    }
    inline int nxt(int x){
        cerr<<x<<' '<<rnk(x+1)<<endl;
        return kth(rnk(x+1)); 
    }
};
signed main(){
    WBLT::init();
    int m;
    cin>>m;
    int op,x;
    while(m--){
        cin>>op>>x;
        if(op==1)WBLT::insert(x);
        if(op==2)WBLT::erase(x);
        if(op==3)cout<<WBLT::rnk(x)<<'\n';
        if(op==4)cout<<WBLT::kth(x)<<'\n';
        if(op==5)cout<<WBLT::pre(x)<<'\n';
        if(op==6)cout<<WBLT::nxt(x)<<'\n';
    }
    return 0;
}
2024/7/14 22:29
加载中...