Treap基础题求中位数,暴灵求助
查看原帖
Treap基础题求中位数,暴灵求助
833124
BIOS楼主2023/8/3 19:53
#include <iostream>
#include <string>
using namespace std;
const int N = 2e5 + 5, INF = 1e9 + 7;
struct node
{
    int l, r, k, v, cnt, size;
} tr[N];
int idx, n, m, x, mid, root;
string op;
int get(int k)
{
    tr[++idx].k = k, tr[idx].v = rand();
    tr[idx].cnt = tr[idx].size = 1;
    return idx;
}
void pushup(int u)
{
    tr[u].size = tr[tr[u].l].size + tr[tr[u].r].size + tr[u].cnt;
}
void zig(int &p)
{
    int q = tr[p].l;
    tr[p].l = tr[q].r, tr[q].r = p, p = q;
    pushup(tr[p].r), pushup(p);
}
void zag(int &p)
{
    int q = tr[p].r;
    tr[p].r = tr[q].l, tr[q].l = p, p = q;
    pushup(tr[p].l), pushup(p);
}
void build()
{
    get(-INF), get(INF), root = 1, tr[1].r = 2;
    pushup(root);
    if (tr[1].v < tr[2].v)
        zag(root);
}
void insert(int &p, int k)
{
    if (!p)
        p = get(k);
    else if (tr[p].k == k)
        tr[p].cnt++;
    else if (tr[p].k > k)
    {
        insert(tr[p].l, k);
        if (tr[tr[p].l].v > tr[p].v)
            zig(p);
    }
    else
    {
        insert(tr[p].r, k);
        if (tr[tr[p].r].v > tr[p].v)
            zag(p);
    }
    pushup(p);
}
int get_key(int p, int k)
{
    if (!p)
        return INF;
    if (tr[tr[p].l].size >= k)
        return get_key(tr[p].l, k);
    if (tr[tr[p].l].size + tr[p].cnt >= k)
        return tr[p].k;
    return get_key(tr[p].r, k - tr[tr[p].l].size - tr[p].cnt);
}
int main()
{
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> n, build();
    for (int i = 1; i <= n; i++)
        cin >> x, insert(root, x);
    cin >> m;
    while (m--)
    {
        cin >> op;
        if (op == "add")
            cin >> x, insert(root, x);
        else
            cout << get_key(root, (idx + 1) / 2) << "\n";
    }
}

样例过了,题面给的那几个说明样例也过了,看着感觉没啥问题啊...

叫上去全红,并且错误信息大部分是第一行,小部分第二行,哪出问题了呢

2023/8/3 19:53
加载中...