Treap 0分求调
查看原帖
Treap 0分求调
610557
shinzanmonoszm 妹妹楼主2023/1/25 23:48
#include<iostream>
#include<random>
std::mt19937 rnd(20230125);
const int sz = 1e4 + 10;
const int inf = 0x7fffffff;
struct BST {
    struct node {
        int val, cnt, lson, rson, size;
        unsigned key;
        node& operator^=(const int &v) {
            val = v;
            cnt = size = 1;
            key = rnd();
            return *this;
        }
    } tree[sz];
    int num, root;
    void resize(int pos) {
        tree[pos].size = tree[pos].cnt + tree[tree[pos].lson].size + tree[tree[pos].rson].size;
    }
    void rotateleft(int &p) {
        int tmp = tree[p].rson;
        tree[p].rson = tree[tmp].lson;
        tree[tmp].lson = p;
        tree[p].size = tree[tmp].size;
        resize(p);
        p = tmp;
    }
    void rotateright(int &p) {
        int tmp = tree[p].lson; 
        tree[p].lson = tree[tmp].rson;
        tree[tmp].rson = p;
        tree[p].size = tree[tmp].size;
        resize(p);
        p = tmp;
    }
    void insert(int &pos, int val) {
        if (pos == 0) return pos = ++num, tree[pos] ^= val, void();
        tree[pos].size++;
        if (tree[pos].val == val) tree[pos].cnt++;
        else if (val < tree[pos].val) {
            insert(tree[pos].lson, val);
            if (tree[pos].key > tree[tree[pos].lson].key) rotateright(pos);
        } else {
            insert(tree[pos].rson, val);
            if (tree[pos].key > tree[tree[pos].rson].key) rotateleft(pos);
        }
    }
    int rank(int pos, int val) {
        if (pos == 0) return 0;
        if (tree[pos].val == val) return tree[tree[pos].lson].size + 1;
        else if (val > tree[pos].val) 
            return tree[tree[pos].lson].size + tree[pos].cnt + rank(tree[pos].rson, val);
        else return rank(tree[pos].lson, val);
    }
    int kthElement(int pos, int k) {
        if (pos == 0) return 0;
        if (k <= tree[tree[pos].lson].size) return kthElement(tree[pos].lson, k);
        else if (k > tree[tree[pos].lson].size + tree[pos].cnt) 
            return kthElement(tree[pos].rson, k - tree[tree[pos].lson].size - tree[pos].cnt);
        else return tree[pos].val;
    }
    int prev(int pos, int val) {
        int res = -inf;
        while (pos != 0) {
            if (val > tree[pos].val)
                res = tree[pos].val, pos = tree[pos].rson;
            else pos = tree[pos].lson;
        }
        return res;
    } 
    int post(int pos, int val) {
        int res = inf;
        while (pos != 0) {
            if (val < tree[pos].val) 
                res = tree[pos].val, pos = tree[pos].lson;
            else pos = tree[pos].rson;
        }
        return res;
    }
} treap;
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int n;
    std::cin >> n;
    while (n--) {
        int op, x;
        std::cin >> op >> x;
        if (op == 1) std::cout << treap.rank(treap.root, x) << "\n";
        if (op == 2) std::cout << treap.kthElement(treap.root, x) << "\n";
        if (op == 3) std::cout << treap.prev(treap.root, x) << "\n";
        if (op == 4) std::cout << treap.post(treap.root, x) << "\n";
        if (op == 5) treap.insert(treap.root, x);
    }
    return 0;
}
2023/1/25 23:48
加载中...