我觉得我对了, 但是TLE0pts
查看原帖
我觉得我对了, 但是TLE0pts
141599
sinsop90楼主2022/1/26 15:26

RT, 数据下载下来本地测试过了, 但是提交全部TLE, 0pts

#include <bits/stdc++.h>
#define maxn 8000005
using namespace std;
int sz[maxn], val[maxn], rd[maxn], ch[maxn][2], tot;
int inf = 2147483647, n, rt[maxn];
int make(int p) {
	sz[++tot] = 1;
	val[tot] = p;
	rd[tot] = rand();
	return tot;
}
int copy(int x) {
	sz[++tot] = sz[x], val[tot] = val[x], rd[tot] = rd[x], ch[tot][0] = ch[x][0], ch[tot][1] = ch[x][1];
	return tot;
}
void pushup(int x) {
	sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1;
}
int merge(int x, int y) {
	if(!x || !y) return x + y;
	int cur;
	if(rd[x] <= rd[y]) {
		cur = copy(y);
		ch[cur][0] = merge(x, ch[cur][0]);
	}
	else {
		cur = copy(x);
		ch[cur][1] = merge(ch[cur][1], y);
	}
	pushup(cur);
	return cur;
}
void split(int p, int k, int &x, int &y) {
	if(!p) x = y = 0;
	else {
		if(val[p] <= k) {
			x = copy(p);
			split(ch[x][1], k, ch[x][1], y);
			pushup(x);
		}
		else {
			y = copy(p);
			split(ch[y][0], k, x, ch[y][0]);
			pushup(y);
		}
	}
} 
void del(int &rt, int k) {
	int x = 0, y = 0, z = 0;
	split(rt, k, x, z);
	split(x, k - 1, x, y);
	y = merge(ch[y][0], ch[y][1]);
	rt = merge(merge(x, y), z);
}
int ins(int &rt, int k) {
	int x = 0, y = 0, z = 0;
	split(rt, k, x, y);
	z = make(k);
	rt = merge(merge(x, z), y);
}
int rnk(int p, int k) {
	while(1) {
		if(k <= sz[ch[p][0]]) p = ch[p][0];
		else if(k == sz[ch[p][0]] + 1) return val[p];
		else k -= (sz[ch[p][0]] + 1), p = ch[p][1];
	}
}
int kth(int &rt, int k) {
	int x, y;
	split(rt, k - 1, x, y);
	int res = sz[x] + 1;
	rt = merge(x, y);
	return res;
}
int pre(int &rt, int k) {
	int x, y, res;
	split(rt, k - 1, x, y);
	if(!x) return -inf;
	res = rnk(x, sz[x]);
	rt = merge(x, y);
	return res;
}
int suc(int &rt, int k) {
	int x, y, res;
	split(rt, k, x, y);
	if(!y) return inf;
	res = rnk(y, 1);
	rt = merge(x, y);
	return res;
}
int main() {
	scanf("%d", &n);
	for(int i = 1;i <= n;i++) {
		int a, op, x;
		scanf("%d%d%d", &a, &op, &x);
		rt[i] = rt[a];
		if(op == 1) ins(rt[i], x);
		else if(op == 2) del(rt[i], x);
		else if(op == 3) printf("%d\n", kth(rt[i], x));
		else if(op == 4) printf("%d\n", rnk(rt[i], x));
		else if(op == 5) printf("%d\n", pre(rt[i], x));
		else printf("%d\n", suc(rt[i], x));
	}
}
2022/1/26 15:26
加载中...