萌新,求助模板题
查看原帖
萌新,求助模板题
125454
CLCA_楼主2021/10/1 22:46

Rt,跳表挂了,WA44分求助。

使用了随机数使得输出也是随机的/kk

#define N 100005
#define M 20
struct node{
	int val, nxt[M + 1], sum[M + 1];
}a[N];
#define nt(x, p) a[x].nxt[p]
int idx, u[M];
inline int g(){int s = 0;while(s + 1 < M && (rand() & 4))s ++;return s;}
void ask(int x){
	int p = M - 1, w = 0;
	while(p >= 0){
		while(nt(w, p) && a[nt(w, p)].val < x)w = nt(w, p);
		u[p--] = w;
	}
}
void ins(int x){
	ask(x); int p = ~0;
	if(a[nt(u[0], 0)].val == x){
		while(++p < M){
			if(a[nt(u[p], p)].val == x)a[nt(u[p], p)].sum[p] ++;
			else a[u[p]].sum[p]++;
		}
	}
	else{
		int q = g(), w = nt(u[0], 0);
		a[++idx].sum[0] = 1, a[idx].val = x;
		nt(idx, 0) = w, nt(u[0], 0) = idx;
		rep(i, 1, q){
			a[idx].sum[i] = a[idx].sum[i - 1];
			while(w != nt(u[i], i))a[idx].sum[i] += a[w].sum[i - 1], w = nt(w, i - 1);
			nt(idx, i) = nt(u[i], i), nt(u[i], i) = idx, a[u[i]].sum[i] -= a[idx].sum[i] - 1;
		}
		rep(i, q + 1, M - 1)a[u[i]].sum[i] ++;
	}
}
void del(int x){
	ask(x); int p = ~0;
	assert(a[nt(u[0], 0)].val == x);
	bool flag = a[nt(u[0], 0)].sum[0] == 1;
	while(++p < M){
		if(a[nt(u[p], p)].val == x){
			if(flag) nt(u[p], p) = a[nt(u[p], p)].nxt[p], a[u[p]].sum[p] += a[nt(u[p], p)].sum[p] - 1;
			else a[nt(u[p], p)].sum[p]--;
		}
		else a[u[p]].sum[p]--;
	}
}
int Rank(int x){
	int p = M - 1, w = 0, ans = 1;
	while(p >= 0){
		while(nt(w, p) && a[nt(w, p)].val < x)ans += a[w].sum[p], w = nt(w, p);
		p--;
	}
	if(!nt(w, 0))ans++;
	return ans;
}
int get(int k){
	int p = M - 1, w = 0;
	while(p >= 0){
		while(k > a[w].sum[p])k -= a[w].sum[p], w = nt(w, p);
		p--;
	}return a[nt(w, 0)].val;
}
int Nxt(int x){
	ask(x); int p = nt(u[0], 0);
	if(a[p].val == x)return a[nt(p, 0)].val;
	return a[p].val;
}
int Pre(int x){
	ask(x);return a[u[0]].val;
}
int main() {
	//freopen("P3369_3.in","r",stdin);
	srand(time(0));
	//int T = read();while(T--)solve();
	int T = read();
	a[0].val = inf_;
	rep(i, 0, M - 1)a[0].sum[i] = 1;
	while(T--){
		int op = read(), x = read();
		if(1 == op)ins(x);
		else if(2 == op)del(x);
		else if(3 == op)printf("%d\n", Rank(x));
		else if(4 == op)printf("%d\n", get(x));
		else if(5 == op)printf("%d\n", Pre(x));
		else printf("%d\n", Nxt(x));
	}
	return 0;
}
2021/10/1 22:46
加载中...