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

只有 52pts,WA

#include<bits/stdc++.h>
#define MAXN 500010
#define INF 1000000000
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_valu(rank,tree[now].lson);
    else if(rank <= tree[tree[now].lson].size + tree[now].cnt) return tree[now].val;
    else return query_valu(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(){
    // freopen("in.in","r",stdin);
    // freopen("out.out","w",stdout);
    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));
    }
}
/*
50
1 25
1 17
1 38
2 17
1 20
1 12
6 24
4 2
5 39
2 38
1 10
1 8
1 6
5 26
6 23
1 35
4 3
1 31
1 19
6 5
1 22
4 1
1 13
2 6
1 27
3 8
1 16
5 11
4 4
*/
2022/5/7 20:49
加载中...