14pts FHQTreap,码风良好,玄关求调
查看原帖
14pts FHQTreap,码风良好,玄关求调
748238
ghx0052楼主2024/9/25 22:17
#include <bits/stdc++.h>
using namespace std;

mt19937 rnd(20111019);
int tot, rt, size;

struct node {
    int l, r;
    int val, key, s;
} t[200010];

void push_up(int x) {
    t[x].s = t[x].val + t[t[x].l].s + t[t[x].r].s;
}

int new_node(int val) {
    ++ tot;
    t[tot].val = val;
    t[tot].l = t[tot].r = 0;
    t[tot].key = rnd();
    t[tot].s = 1;
    return tot;
}

void split(int p, int val, int &l, int &r) {
    if (!p) {
        l = r = 0;
        return;
    }
    if (t[p].val < val) {
        l = p;
        split(t[p].r, val, t[p].r, r);
    } else {
        r = p;
        split(t[p].l, val, l, t[p].l);
    }
}

int merge(int l, int r) {
    if (!l || !r) return l | r;
    if (t[l].key > t[r].key) {
        t[l].r = merge(t[l].r, r);
        push_up(l);
        return l;
    } else {
        t[r].l = merge(l, t[r].l);
        push_up(r);
        return r;
    }
}

void insert(int val) {
    int dl, dr;
    split(rt, val, dl, dr);
    rt = merge(merge(dl, new_node(val)), dr);
    return;
}

void erase(int val) {
    int dl, dr, temp;
    split(rt, val, dl, dr);
    split(dl, val - 1, dl, temp);
    temp = merge(t[temp].l, t[temp].r);
    rt = merge(merge(dl, temp), dr);
    return;
}

int get_rank(int val) {
    int dl, dr;
    split(rt, val - 1, dl, dr);
    int rnk = t[dl].s + 1;
    rt = merge(dl, dr);
    return rnk;
}

int rank_find(int rnk) {
    int p = rt;
    while (true) {
        if (t[t[p].l].s + 1 == rnk) return t[p].val;
        else if (t[t[p].l].s >= rnk) p = t[p].l;
        else rnk -= t[t[p].l].s + 1, p = t[p].r;
    }
}

int pre(int val) {
    int dl, dr;
    split(rt, val - 1, dl, dr);
    int p = dl;
    while (t[p].r) p = t[p].r;
    rt = merge(dl, dr);
    return t[p].val;
}

int suf(int val) {
    int dl, dr;
    split(rt, val, dl, dr);
    int p = dr;
    while (t[p].l) p = t[p].l;
    rt = merge(dl, dr);
    return t[p].val;
}

void solve() {
    int opt, x;
    scanf("%d%d", &opt, &x);
    if (opt == 1) insert(x);
    else if (opt == 2) erase(x);
    else if (opt == 3) printf("%d\n", get_rank(x));
    else if (opt == 4) printf("%d\n", rank_find(x));
    else if (opt == 5) printf("%d\n", pre(x));
    else printf("%d\n", suf(x));
}

int main() {
    int q;
    cin >> q;
    while (q --) solve();
    return 0;
}

求助大佬

2024/9/25 22:17
加载中...