有没有大佬给看一下这个 WBLT
  • 板块学术版
  • 楼主mmr123
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/26 07:49
  • 上次更新2024/6/26 14:27:56
查看原帖
有没有大佬给看一下这个 WBLT
460020
mmr123楼主2024/6/26 07:49
#include <bits/stdc++.h>
using namespace std;

template <typename T>
class WBLT {
  private:
    struct node {
        node *l, *r;
        int   val, size;

        node *merge(node *a, node *b) {
            node *res = new node(a, b, 0, 0);
            res->push_up();
            return res;
        }

        void push_up() {
            if (this->l != nullptr && this->r != nullptr) {
                this->val  = this->r->val;
                this->size = this->l->size + this->r->size;
            } else {
                this->size = 1;
            }
        }

        void rotate(bool flag) {
            if (this->l == nullptr || this->r == nullptr) {
                return;
            }

            if (flag) {
                this->l = merge(this->l, this->r->l);
                this->r = this->r->r;
            } else {
                this->r = merge(this->l->r, this->r);
                this->l = this->l->l;
            }
        }

        void matain() {

            if (this->size == 1) {
                return;
            }

            if (this->l->size > this->r->size * 3) {
                if (this->l->size != 1 && this->l->r->size > this->l->l->size * 2) {
                    this->l->rotate(1);
                }
                this->rotate(0);
            } else if (this->r->size > this->l->size * 3) {
                if (this->r->size != 1 && this->r->l->size > this->r->r->size * 2) {
                    this->r->rotate(0);
                }
                this->rotate(1);
            }
        }

        node() {}

        node(node *_l, node *_r, int _val, int _size)
            : l(_l), r(_r), val(_val), size(_size) {}

        node(int _val)
            : l(nullptr), r(nullptr), val(_val), size(1) {}
    } *root;

  public:
    WBLT()
        : root(new node(1e8)) {}

    ~WBLT() {}

    void insert(int v, node *p = nullptr) {

        if (p == nullptr) {
            p = root;
        }

        // cout << p << ' ' << p->l << ' ' << p->r << ' ' << p->size << ' ' << p->val << endl;

        if (p->size == 1) {
            p->l = new node(min(v, p->val));
            p->r = new node(max(v, p->val));

            // cout << "insert over " << p << ' ' << p->l << ' ' << p->r << ' ' << p->size << ' ' << p->val << endl;

            p->push_up();
            // cout << p << " pushup\n";

            p->matain();
            // cout << p << " matain\n";

            return;
        }

        if (p->l->val >= v) {
            insert(v, p->l);
        } else {
            insert(v, p->r);
        }

        p->push_up();
        // cout << p << " pushup\n";

        p->matain();
        // cout << p << " matain\n";

        return;
    }

    void del(int v, node *p = nullptr, node *f = nullptr) {
        if (p == nullptr && f == nullptr) {
            p = f = root;
        }

        if (p->size == 1) {
            if (f->l->val == v) {
                f = f->r;
            } else if (f->r->val == v) {
                f = f->l;
            }

            return;
        }

        if (p->l->val >= v) {
            del(v, p->l, p);
        } else {
            del(v, p->r, p);
        }

        p->push_up();
        p->matain();

        return;
    }

    int rank(int v, node *p = nullptr) {
        if (p == nullptr) {
            p = root;
        }

        if (p->size == 1) {
            return p->val <= v;
        }

        if (p->l->val > v) {
            return rank(v, p->l);
        } else {
            return rank(v, p->r) + p->l->size;
        }
    }

    int kth(int v, node *p = nullptr) {
        if (p == nullptr) {
            p = root;
        }

        if (p->size == v) {
            return p->val;
        }

        if (p->l->size >= v) {
            return kth(v, p->l);
        } else {
            return kth(v - p->l->size, p->r);
        }
    }

    int pre(int v) {
        return kth(rank(v - 1));
    }

    int nxt(int v) {
        return kth(rank(v) + 1);
    }
};

int       m;
WBLT<int> wblt;

int main() {

    // freopen("Weight Balanced Leafy Tree.in", "r", stdin);
    // freopen("Weight Balanced Leafy Tree.out", "w", stdout);

    scanf("%d", &m);

    while (m--) {
        int op, t;
        scanf("%d%d", &op, &t);

        if (op == 1) {
            wblt.insert(t);
        } else if (op == 2) {
            wblt.del(t);
        } else if (op == 3) {
            printf("%d\n", wblt.rank(t - 1) + 1);
        } else if (op == 4) {
            printf("%d\n", wblt.kth(t));
        } else if (op == 5) {
            printf("%d\n", wblt.pre(t));
        } else {
            printf("%d\n", wblt.nxt(t));
        }
    }

    // fclose(stdin);
    // fclose(stdout);

    // system("pause");

    return 0;
}

目前 RE。

2024/6/26 07:49
加载中...