社区讨论

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 条回复,欢迎继续交流。

正在加载回复...