0分求助,悬一关
查看原帖
0分求助,悬一关
978486
ca0vnv楼主2024/8/12 14:32

0分代码

/*********************************************************************
    程序名:
    版权: 归作者所有
    作者: 洛谷:ca0vnv
    日期: 2024-05-26 16:04
    说明: 这里应该没有村里人了吧
*********************************************************************/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10, inf = 0x7fffffff;
int idx, n, opt, xx;

struct node {
	int size, val, cnt, lc, rc;
} tree[N];

void add(int pos, int val) {
	tree[pos].size++;
	if (tree[pos].val == val) {
		tree[pos].cnt++;
		return ;
	}
	if (tree[pos].val < val) {
		if (tree[pos].lc) {
			add(tree[pos].lc, val);
		} else {
			tree[++idx].val = val;
			tree[idx].size = tree[idx].cnt = 1;
			tree[pos].lc = idx;
		}
	} else {
		if (tree[pos].rc) {
			add(tree[pos].rc, val);
		} else {
			tree[++idx].val = val;
			tree[idx].size = tree[idx].cnt = 1;
			tree[pos].rc = idx;
		}
	}
}

int query_pre(int pos, int val, int ans) {
	if (tree[pos].val >= val) {
		if (tree[pos].lc == 0) {
			return ans;
		} else {
			return query_pre(tree[pos].lc, val, ans);
		}
	} else {
		if (tree[pos].rc == 0) {
			return tree[pos].val < val ? tree[pos].val : ans;
		}
		if (!tree[pos].cnt) {
			return  query_pre(tree[pos].rc, val, tree[pos].val);
		}
		return query_pre(tree[pos].rc, val, ans);
	}
}

int query_next(int pos, int val, int ans) {
	if (tree[pos].val <= val) {
		if (tree[pos].rc == 0) {
			return ans;
		} else {
			return query_next(tree[pos].rc, val, ans);
		}
	} else {
		if (tree[pos].lc == 0) {
			return tree[pos].val > val ? tree[pos].val : ans;
		}
		if (!tree[pos].cnt) {
			return  query_next(tree[pos].lc, val, tree[pos].val);
		}
		return query_next(tree[pos].lc, val, ans);
	}
}

int query_rank(int pos, int val) {
	if (pos == 0) {
		return 0;
	}
	if (val == tree[pos].val) {
		return tree[tree[pos].lc].size;
	}
	if (tree[pos].val > val) {
		return query_rank(tree[pos].lc, val);
	}
	return query_rank(tree[pos].rc, val) + tree[tree[pos].lc].size + tree[pos].cnt;
}

int query_val(int pos, int rk) {
	if (pos == 0) {
		return inf;
	}
	if (tree[tree[pos].lc].size >= rk) {
	} if (tree[tree[pos].lc].size + tree[pos].cnt >= rk) {
		return query_val(tree[pos].lc, rk);
		return tree[pos].val;
	}
	return query_val(tree[pos].rc, rk - tree[tree[pos].lc].size - tree[pos].cnt);
}

signed main() {
	cin >> n;
	while (n--) {
		cin >> opt >> xx;
		if (opt == 1) {
			cout << query_rank(1, xx) + 1<<endl;
		} else if (opt == 2) {
			cout << query_val(1, xx)<<endl;
		} else if (opt == 3) {
			cout << query_pre(1, xx, -inf)<<endl;
		} else if (opt == 4) {
			cout << query_next(1, xx, inf)<<endl;
		} else {
			if (idx == 0) {
				idx++;
				tree[idx].cnt = tree[idx].size = 1;
				tree[idx].val = xx;
			} else {
				add(1, xx);
			}
		}
	}
	return 0;
}
2024/8/12 14:32
加载中...