社区讨论
42pts跳跃表求调(玄一关)
P3369【模板】普通平衡树参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhjdouk2
- 此快照首次捕获于
- 2025/11/04 00:52 4 个月前
- 此快照最后确认于
- 2025/11/04 00:52 4 个月前
rt,代码如下,非指针实现
CPP#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
const int MAXL = 20;
const int inf = 0x7f7f7f7f;
int n;
int val[N<<4];
int fd[N<<4][MAXL];
int head,lv,sz;
int randLevel() {
int lay = 1;
while ((rand() & 1) && lay < MAXL) ++ lay;
return lay;
}
void init() {
val[0] = -inf;
for (int i = 0; i < MAXL; ++i) fd[0][i] = 0;
head = 1,lv = 1,sz = 0;
srand(time(0));
}
void insert(int k) {
int updata[MAXL];
int u = 0;
for (int i = lv - 1; i >= 0; --i) {
while (fd[u][i] && val[fd[u][i]] < k) u = fd[u][i];
updata[i] = u;
}
int lay = randLevel();
if (lay > lv) {
for (int i = lv; i < lay; ++i) updata[i] = 0;
lv = lay;
}
int idx = head ++;
val[idx] = k;
for (int i = 0; i < lay; ++i) {
fd[idx][i] = fd[updata[i]][i];
fd[updata[i]][i] = idx;
}
++ sz;
}
void remove(int k) {
int updata[MAXL];
int u = 0;
for (int i = lv - 1; i >= 0; --i) {
while (fd[u][i] != 0 && val[fd[u][i]] < k) u = fd[u][i];
updata[i] = u;
}
int v = fd[u][0];
//if (v == 0 || val[v] != k) return;
for (int i = 0; i < lv; ++i) {
if (fd[updata[i]][i] == v) fd[updata[i]][i] = fd[v][i];
}
-- sz;
while (lv > 1 && !fd[0][lv - 1]) --lv;
}
int rnk(int k){//
int cur = 0,cnt = 0;
while (fd[cur][0] && val[fd[cur][0]] <= k) {
cur = fd[cur][0];
++ cnt;
}
return cnt;
}
int kth(int k) {
if (k <= 0 || k > sz) return 0;
int cur = 0;
for (int t = 0; t < k; ++t) cur = fd[cur][0];
return val[cur];
}
int getpre(int x){
int u = 0;
for(int i = lv-1;i >= 0;-- i){
while(fd[u][i] && val[fd[u][i]] < x)
u = fd[u][i];
}
return val[u];
}
int getnxt(int x){
int u = 0;
for(int i = lv-1;i >= 0;-- i){
while(fd[u][i] && val[fd[u][i]] <= x)
u = fd[u][i];
}
int v = fd[u][0];
return val[v];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
init();
while(n--){
int x,op;
cin >> op >> x;
switch(op){
case 1: insert(x);break;
case 2: remove(x);break;
case 3: cout << rnk(x) << '\n';break;
case 4: cout << kth(x) << '\n';break;
case 5: cout << getpre(x) << '\n';break;
case 6: cout << getnxt(x) << '\n';break;
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...