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