社区讨论
求调
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 条回复,欢迎继续交流。
正在加载回复...