dalao求助,样例过了,全wa
查看原帖
dalao求助,样例过了,全wa
924484
looloa楼主2023/6/7 13:16
#include <iostream>
#include <climits>
#define MAX_ARR_NUM 1145141


using namespace std;


class tree_node{
	public:
		int val;
		int l;
		int r;
		int sonnum;
		int nodenum;
		
		tree_node(int _l=0, int _r=0, int _sonnum=0){
			this->l = _l;
			this->r = _r;
			this->sonnum = _sonnum;
		}
};
tree_node trees[MAX_ARR_NUM];

int cnt = 0;

void add(int x, int v){  // x为二叉树的根结点位置, v则是待插入的value
	trees[x].sonnum++;
	if(v == trees[x].val) {trees[x].nodenum++; return;}
	
	if(v < trees[x].val) {
		if(trees[x].l)
			add(trees[x].l, v);
		else{
			++cnt;  // 要多一个结点了
			trees[cnt].val = v;
			trees[cnt].nodenum = 1;
			trees[x].l = cnt;
		}
	}
	else{
		if(trees[x].r)
			add(trees[x].r, v);
		else{
			++cnt;
			trees[cnt].val = v;
			trees[cnt].nodenum = 1;
			trees[x].r = cnt;
		}
	}
}


int find_fr(int x, int v, int ans){  // x为二叉树的根结点位置, v是要寻找前驱的值, ans是目前最大的比v小的值.
	if(trees[x].val>=v){  // 大了, 试着往左子树找 
		if(trees[x].l)
			return find_fr(trees[x].l, v, ans);
		else  // 没了? 那就返回答案 
			return ans;
	}
	else{
		if(!trees[x].r)  // 没有右孩子, 那就返回这个值.
			return trees[x].val;
		else  // 再往右边走走看看 
			return find_fr(trees[x].r, v, trees[x].val);
	}
}

int find_ne(int x, int v, int ans){
	if(trees[x].val<=v){
		if(trees[x].r)
			return find_ne(trees[x].r, v, ans);
		else
			return ans;
	}
	else{
		if(!trees[x].l)
			return trees[x].val;
		else
			return find_ne(trees[x].l, v, trees[x].val);
	}
}


// 用val找排名. 
int find_lev(int x, int val){  // x为二叉树的根结点位置, val则是要找的排名.
	if(x==0) return 0;  // x是空的
	
	if(trees[x].val==val) return trees[trees[x].l].sonnum + trees[trees[x].l].nodenum;
	else   if(trees[x].val>val)  return find_lev(trees[x].l, val);
	else /*if(trees[x].val<val)*/return find_lev(trees[x].r, val) + trees[trees[x].l].nodenum + trees[trees[x].l].sonnum + trees[x].nodenum;
}


// 用排名找val.
int find_val(int x, int lev){
	if(x==0) return INT_MAX;
	
	if(trees[x].l>=lev) return find_val(trees[x].l, lev);
	else if(trees[trees[x].l].nodenum + trees[trees[x].l].sonnum + trees[x].nodenum >= lev) return trees[x].val;
	else return find_val(trees[x].r, lev-trees[trees[x].l].nodenum-trees[trees[x].l].sonnum-trees[x].nodenum);
}


int main(){
	
	int n;
	cin >> n;
	
	for(int i=1; i<=n; i++){
		int ctrl;
		int num;
		cin >> ctrl >> num;
		
		switch(ctrl){
			case 1: {cout << find_lev(1, num)+1 << endl; break;}
			case 2: {cout << find_val(1, num) << endl; break;}
			case 3: {cout << find_fr(1, num, -INT_MAX) << endl;  break;}
			case 4: {cout << find_ne(1, num, INT_MAX) << endl; break;}
			
			case 5: {
			if(!cnt){
				++cnt;
				trees[cnt].val = num;
				trees[cnt].nodenum = 1;
			}
			else add(1, num);
			
			break;
			}
		}
	}
}
2023/6/7 13:16
加载中...