求助,P5076,样例过了,但是全部wa,有大佬能看看问题在哪里吗
  • 板块学术版
  • 楼主yukun1101
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/7/25 15:52
  • 上次更新2023/10/27 18:29:36
查看原帖
求助,P5076,样例过了,但是全部wa,有大佬能看看问题在哪里吗
594523
yukun1101楼主2022/7/25 15:52
#include<bits/stdc++.h>

using namespace std;

int n;
const int N = 1e4 + 10, INF = 1e9 + 10;


struct Node{
	int l, r;
	int key,val;
	int cnt, size;
}tr[N];

int root, idx;

void pushup(int p){
	tr[p].size = tr[tr[p].l].size + tr[tr[p].r].size + tr[p].cnt; 
}

int get_node(int key){
	tr[++idx].key = key;
	tr[idx].val = rand();
	tr[idx].cnt = tr[idx].size = 1; 
	return idx; 
}

void zig(int &p){
	int q = tr[p].l;
	tr[p].l = tr[q].r , tr[q].r = p, p = q;
	pushup(tr[p].r), pushup(p);
}

void zag(int &p){
	int q = tr[p].r;
	tr[p].r = tr[q].l, tr[q].l = p, p = q;
	pushup(tr[p].l), pushup(p);
}

void build(){
	get_node(-2147483647), get_node(2147483647);
	root = 1, tr[root].r = 2;
	pushup(root);
	if(tr[1].val < tr[2].val) zag(root);
}

void insert(int &p, int key){
	if(!p) p = get_node(key);
	else if(tr[p].key == key) tr[p].cnt++;
	else if(tr[p].key > key){
		insert(tr[p].l, key);
		if(tr[tr[p].l].val > tr[p].val) zig(p);
	}else{
		insert(tr[p].r, key);
		if(tr[tr[p].r].val > tr[p].val) zag(p);
	}
	
	pushup(p);
}

int get_rank_by_key(int p, int key){
	if(!p) return 0;
	if(tr[p].key == key) return tr[tr[p].l].size + 1;
	if(tr[p].key > key) return get_rank_by_key(tr[p].l, key);
    return tr[tr[p].l].size + tr[p].cnt + get_rank_by_key(tr[p].r, key);
}

int get_key_by_rank(int p, int rank){
	if(!p) return INF;
	if(tr[tr[p].l].size >= rank) return get_key_by_rank(tr[p].l, rank);
	if(tr[tr[p].l].size + tr[p].cnt >= rank) return tr[p].key;
	return get_key_by_rank(tr[p].r, rank - tr[tr[p].l].size - tr[p].cnt);
}


int get_prev(int p, int key){
	if(!p) return -2147483647;
	if(tr[p].key >= key) return get_prev(tr[p].l, key);
	return max(tr[p].key, get_prev(tr[p].r, key));
}

int get_next(int p, int key){
	if(!p) return 2147483647;
	if(tr[p].key <= key) return get_next(tr[p].r, key);
	return min(tr[p].key, get_next(tr[p].l, key));
}

int main(){
	int q;
	cin>>q;
	build();
	while(q--){
		int op,x;
		scanf("%d%d", &op, &x);
		if(op == 1){
			cout<<get_rank_by_key(root, x) - 1<<endl;
		}else if(op == 2){
			cout<<get_key_by_rank(root, x + 1)<<endl; 
		}else if(op == 3){
			cout<<get_prev(root, x)<<endl;
		}else if(op == 4){
			cout<<get_next(root, x)<<endl;
		}else{
			insert(root, x);
		}
	}
	return 0;
}
2022/7/25 15:52
加载中...