fhq treap求助
查看原帖
fhq treap求助
305027
Tarantula楼主2021/5/1 12:35

RT,本地测样例一直RE,求大佬查错

#include<bits/stdc++.h>
using namespace std;
int n;
int val[100005], rd[100005];
int size[100005], son[100005][2];
int sum, f, x, y, z;
int new_node(int v) {
	sum++;
	val[sum] = v; rd[sum] = rand(); size[v] = 1;
	return sum;
}
void pushup(int k) {size[k] = size[son[k][0]] + size[son[k][1]] + 1;}
void split(int k, int v, int &x, int &y) {
	if (!k) {x = y = 0; return;}
	if (val[k] <= v)
	    x = k, split(son[k][1], v, son[k][1], y);
	else
	    y = k, split(son[k][0], v, x, son[k][0]);
	pushup(k);
}
int merge(int x, int y) {
	if (!x || !y) return x + y;
	if (rd[x] < rd[y]) {
		son[x][1] = merge(son[x][1], y); pushup(x);
		return x;
	} else {
		son[y][0] = merge(x, son[y][0]); pushup(y);
		return y;
	}
}
void insert(int v) {
	split(f, v, x, y);
	f = merge(merge(x, new_node(v)), y);
}
void del(int v) {
	split(f, v, x, z);
	split(x, v - 1, x, y);
	y = merge(son[y][0], son[y][1]);
	f = merge(merge(x, y), z);
}
int rank(int v) {
	split(f, v - 1, x, y);
	int ans = size[x] + 1;
	f = merge(x, y);
	return ans;
}
int kth(int k, int x) {
	if (!k) return 0;
	if (size[son[k][0]] >= x) return kth(son[k][0], x);
	if (size[son[k][0]] + 1 < x) return kth(son[k][1], x - size[son[k][0]] - 1);
	else return val[k];
}
int pre(int v) {
	split(f, v - 1, x, y);
	int ans = kth(x, size[x]);
	f = merge(x, y);
	return ans;
}
int nxt(int v) {
	split(f, v, x, y);
	int ans = kth(y, 1);
	f = merge(x, y);
	return ans;
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int p, x; cin >> p >> x;
		switch (p) {
			case 1: insert(x); break;
			case 2: del(x); break;
			case 3: cout << rank(x) << endl; break;
			case 4: cout << kth(f, x) << endl; break;
			case 5: cout << pre(x) << endl; break;
			default: cout << nxt(x) << endl; break;
		}
	}
	return 0;
}
2021/5/1 12:35
加载中...