社区讨论

求调

P5076【深基16.例7】普通二叉树(简化版)参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lyjtgusm
此快照首次捕获于
2024/07/13 15:39
2 年前
此快照最后确认于
2024/07/13 16:44
2 年前
查看原帖
CPP
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#define coutdouble(a, b) cout << fixed << setprecision(a) << (b)
#define ll long long
#define endl '\n'

using namespace std;

const int N = 1e4 + 5;
const int NOT_FIND = 2147483647;
const int INF = 0x3f3f3f;
const int INFS = -0x3f3f3f;

int q;
int op, x;
int siz = 0;

struct node
{
    int l, r; // 左,右儿子的下标
    int val, cnt; // val:节点权值,cnt:这个节点的子树大小
} tree[N];

void init(int x)
{
    tree[++siz].cnt = 1;
    tree[siz].val = x;
    tree[siz].l = tree[siz].r = -1;
}

void insert(int x, int now)
{
    if (siz == 0) init(x);
    else if (x > tree[now].val)
    {
        tree[now].cnt += 1;
        if (tree[now].r == -1)
        {
            init(x);
            tree[now].r = siz;
        }
        else insert(x, tree[now].r);
    }
    else
    {
        tree[now].cnt++;
        if (tree[now].l == -1)
        {
            init(x);
            tree[now].l = siz;
        }
        else insert(x, tree[now].l);
    }
}

int query(int x, int now)
{
    if (now == -1) return 0;
    if (tree[now].val < x)
    {
        int num = 1;
        if (tree[now].l != -1) num += tree[tree[now].l].cnt;
        if (tree[now].r == -1) return num;
        return num + query(x, tree[now].r);
    }
    else
    {
        if (tree[now].l == -1) return 0;
        return query(x, tree[now].l);
    }
}

int find(int x, int now)
{
    int l = 0;
    if (tree[now].l != -1) l = tree[tree[now].l].cnt;
    if (x == l + 1) return tree[now].val;
    else if (x <= l) return find(x, tree[now].l);
    else return find(x - (l + 1), tree[now].r);
}

int last(int x, int now)
{
    if (tree[now].val >= x)
    {
        if (tree[now].l == -1) return -NOT_FIND;
        return last(x, tree[now].l);
    }
    else
    {
        if (tree[now].r == -1) return tree[now].val;
        return max(tree[now].val, last(x, tree[now].r));
    }
}

int next(int x, int now)
{
    if (tree[now].val > x)
    {
        if (tree[now].l == -1) return tree[now].val;
        return min(tree[now].val, next(x, tree[now].l));
    }
    else
    {
        if (tree[now].r == -1) return NOT_FIND;
        return next(x, tree[now].r);
    }
}

void solve()
{
    cin >> q;
    while (q--)
    {
        cin >> op >> x;

        if (op == 1) cout << query(x, 1) << endl;
        if (op == 2) cout << find(x, 1) << endl;
        if (op == 3) cout << last(x, 1) << endl;
        if (op == 4) cout << next(x, 1) << endl;
        if (op == 5) insert(x, 1);
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);  // 关闭同步流

    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

回复

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

正在加载回复...