社区讨论

65pts玄关求调(违规自删)

P3369【模板】普通平衡树参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mjk1uxd1
此快照首次捕获于
2025/12/24 21:28
2 个月前
此快照最后确认于
2025/12/27 10:05
2 个月前
查看原帖
rt
https://www.luogu.com.cn/record/254932060
CPP
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define fr(a, b, c) for (c = a; c <= b; c++)
#define rf(a, b, c) for (c = a; c >= b; c--)
#define I_AK_CSP                  \
    ios_base::sync_with_stdio(0); \
    cin.tie(0)
#define MAXN 1000001
using namespace std;
ll z, t, ma, mi;
struct Node
{
    Node *ch[2];
    ll n, m, ans, siz;
    Node(ll n) : n(n), ans(1), siz(1)
    {
        ch[0] = ch[1] = nullptr;
        m = rand();
    }
    void update()
    {
        siz = ans;
        if (ch[0] != nullptr)
            siz += ch[0]->siz;
        if (ch[1] != nullptr)
            siz += ch[1]->siz;
    }
} *r;
void build()
{
    r = new Node(LLONG_MAX);
    r->ch[1] = new Node(LLONG_MIN);
    r->update();
}
void rotate(Node *&x, ll k)
{
    Node *ls = x->ch[k];
    x->ch[k] = ls->ch[!k];
    ls->ch[!k] = x;
    x->update(), ls->update();
    x = ls;
}
void insert(Node *&x, ll n)
{
    if (x == nullptr)
    {
        x = new Node(n);
    }
    else if (n == x->n)
    {
        x->ans++;
        x->siz++;
    }
    else if (n < x->n)
    {
        insert(x->ch[0], n);
        if (x->ch[0]->m < x->m)
        {
            rotate(x, 0);
        }
        x->update();
    }
    else
    {
        insert(x->ch[1], n);
        if (x->ch[1]->m < x->m)
        {
            rotate(x, 1);
        }
        x->update();
    }
}
void del(Node *&x, ll n)
{
    if (n > x->n)
    {
        if (x->ch[1] != nullptr)
            del(x->ch[1], n);
        x->update();
    }
    else if (n < x->n)
    {
        if (x->ch[0] != nullptr)
            del(x->ch[0], n);
        x->update();
    }
    else
    {
        ll state = 0;
        state |= (x->ch[0] != nullptr);
        state |= ((x->ch[1] != nullptr) << 1);
        Node *ls = x;
        switch (state)
        {
        case 0:
            x = nullptr;
            break;
        case 1:
            x = ls->ch[0];
            break;
        case 2:
            x = ls->ch[1];
            break;
        case 3:
            ll f = x->ch[0]->m < x->ch[1]->m ? 0 : 1;
            rotate(x, f);
            del(x->ch[!f], n);
            x->update();
            break;
        }
    }
}
ll query_rank(Node *x, ll n) // 根据值查询排名
{
    ll leftsize = x->ch[0] == nullptr ? 0 : x->ch[0]->siz;
    if (n == x->n)
    {
        return leftsize + 1;
    }
    else if (n < x->n)
    {
        if (x->ch[0] != nullptr)
        {
            return query_rank(x->ch[0], n);
        }
        else
        {
            return 1;
        }
    }
    else
    {
        if (x->ch[1] != nullptr)
        {
            return leftsize + x->ans + query_rank(x->ch[1], n);
        }
        else
        {
            return x->siz + 1;
        }
    }
}
ll query_val(Node *x, ll n) // 根据排名查询值
{
    ll leftsize = x->ch[0] == nullptr ? 0 : x->ch[0]->siz;
    if (n <= leftsize)
    {
        return query_val(x->ch[0], n);
    }
    else if (n <= leftsize + x->ans)
    {
        return x->n;
    }
    else
    {
        return query_val(x->ch[1], n - leftsize - x->ans);
    }
}
void query_prev(Node *x, ll n)
{
    if (n <= x->n)
    {
        if (x->ch[0] != nullptr)
            query_prev(x->ch[0], n);
    }
    else
    {
        ma = x->n;
        if (x->ch[1] != nullptr)
            query_prev(x->ch[1], n);
    }
}
void query_nex(Node *x, ll n)
{
    if (n >= x->n)
    {
        if (x->ch[1] != nullptr)
            query_nex(x->ch[1], n);
    }
    else
    {
        mi = x->n;
        if (x->ch[0] != nullptr)
            query_nex(x->ch[0], n);
    }
}
int main()
{
    I_AK_CSP;
    srand(time(0));
    build();
    cin >> t;
    while (t--)
    {
        ll ls, lls;
        cin >> ls >> lls;
        switch (ls)
        {
        case 1:
            insert(r, lls);
            break;
        case 2:
            del(r, lls);
            break;
        case 3:
            cout << query_rank(r, lls) << "\n";
            break;
        case 4:
            cout << query_val(r, lls) << "\n";
            break;
        case 5:
            ma = -1e9;
            query_prev(r, lls);
            cout << ma << "\n";
            break;
        case 6:
            mi = 1e9;
            query_nex(r, lls);
            cout << mi << "\n";
            break;
        }
    }
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...