Treap 求调
查看原帖
Treap 求调
547908
NightTide楼主2022/5/7 16:25

RT,Treap WA 只有 36 分,求大佬帮忙调

以下是代码:

#include<bits/stdc++.h>
#define MAXN 500010
#define INF 2000000010
using namespace std;
struct node{
    int lson,rson;
    int val,rnd,cnt,size;
};
int n,tot,ans,root = 0;
node tree[MAXN];
void push_up(int now){
    tree[now].size = tree[tree[now].lson].size + tree[tree[now].rson].size + tree[now].cnt;
}
void turn_l(int &now){
    int tmp = tree[now].rson;
    tree[now].rson = tree[tmp].lson;
    tree[tmp].lson = now;
    now = tmp;
    push_up(tree[now].lson);
    push_up(now);
}
void turn_r(int &now){
    int tmp = tree[now].lson;
    tree[now].lson = tree[tmp].rson;
    tree[tmp].rson = now;
    now = tmp;
    push_up(tree[now].rson);
    push_up(now);
}
void insert(int x,int &now){
    if(now == 0){
        now = ++tot;
        tree[now].val = x;
        tree[now].rnd = rand();
        tree[now].cnt = tree[now].size = 1;
        return ;
    }
    if(x == tree[now].val){
        tree[now].cnt++;
    }else if(x < tree[now].val){
        insert(x,tree[now].lson);
        if(tree[now].rnd > tree[tree[now].lson].rnd) turn_r(now);
    }else if(x > tree[now].val){
        insert(x,tree[now].rson);
        if(tree[now].rnd > tree[tree[now].rson].rnd) turn_l(now);
    }
    push_up(now);
}
void remove(int x,int &now){
    if(now == 0) return ;
    if(x == tree[now].val){
        if(tree[now].cnt > 1) tree[now].cnt--;
        else{
            if(tree[now].lson == 0 && tree[now].rson == 0){
                now = 0;
            }else if(tree[now].rson == 0 || tree[tree[now].rson].rnd < tree[tree[now].lson].rnd){
                turn_r(now);
                remove(x,tree[now].rson);
            }else if(tree[now].lson == 0 || tree[tree[now].rson].rnd > tree[tree[now].lson].rnd){
                turn_l(now);
                remove(x,tree[now].lson);
            }
        }
        return ;
    }
    if(x < tree[now].val) remove(x,tree[now].lson);
    else remove(x,tree[now].rson);
    push_up(now);
}
int query_rank(int val,int now){
    if(now == 0) return -1;
    if(val == tree[now].val) return tree[tree[now].lson].size + 1;
    else if(val < tree[now].val) return query_rank(val,tree[now].lson);
    else if(val > tree[now].val) return query_rank(val,tree[now].rson) + tree[tree[now].lson].size + tree[now].cnt;
}
int query_valu(int rank,int now){
    if(now == 0) return INF;
    if(rank <= tree[tree[now].lson].size) return query_rank(rank,tree[now].lson);
    else if(rank <= tree[tree[now].lson].size + tree[now].cnt) return tree[now].val;
    else return query_rank(rank - (tree[tree[now].lson].size + tree[now].cnt),tree[now].rson);
}
int find_pre(int x,int now){
    int pre = -INF;
    while(now){
        if(tree[now].val < x){
            pre = tree[now].val;
            now = tree[now].rson;
        }else{
            now = tree[now].lson;
        }
    }
    return pre;
}
int find_nxt(int x,int now){
    int nxt = INF;
    while(now){
        if(tree[now].val > x){
            nxt = tree[now].val;
            now = tree[now].lson;
        }else{
            now = tree[now].rson;
        }
    }
    return nxt;
}
int main(){
    scanf("%d",&n);
    for(int i = 1;i <= n;i++){
        int op,x;
        scanf("%d%d",&op,&x);
        if(op == 1) insert(x,root);
        else if(op == 2) remove(x,root);
        else if(op == 3) printf("%d\n",query_rank(x,root));
        else if(op == 4) printf("%d\n",query_valu(x,root));
        else if(op == 5) printf("%d\n",find_pre(x,root));
        else if(op == 6) printf("%d\n",find_nxt(x,root));
    }
}
2022/5/7 16:25
加载中...