对顶堆模板

【牛客一道模板】

struct MidNum {
    multiset<int> p, q;
    //p 从大到小 q从小到大
    void work() {
        while (p.size() > q.size() + 1) {
            q.insert(*p.rbegin());
            p.erase(--p.end());
        }
        while (p.size() < q.size()) {
            p.insert(*q.begin());
            q.erase(q.begin());
        }
    }
    void add(int x) {
        if (!q.empty() && x >= *q.begin()) {
            q.insert(x);
        }
        else {
            p.insert(x);
        }
        work();
    }
    void del(int x) {
        if (q.contains(x)) {
            q.erase(q.lower_bound(x));
        }
        else if (p.contains(x)) {
            p.erase(p.lower_bound(x));
        }
        work();
    }
    int get_mid() {
        return *p.rbegin();
    }
    /*
    偶数时中位数;
    */
    int get_even_mid() {
        return (*p.rbegin() + *q.begin()) / 2;
    }
};
posted @ 2025-08-13 19:03  Ke_scholar  阅读(19)  评论(0)    收藏  举报