这题的数据到底有没有问题&求Hack
查看原帖
这题的数据到底有没有问题&求Hack
399150
Shunpower楼主2021/10/15 17:38

RT

这个帖子说深基的程序有误但可以 AC 本题,但是到底是数据按照深基配的还是数据弱了却不得而知

所以这题的数据到底有没有问题,如果没有,求给这份代码一个 Hack,谢谢!

#include <bits/stdc++.h>
using namespace std;
struct node{
	int l,r,num,size,val;//left->small,right->big or ==
} a[10010];
int q;
int tot=1;
int rak(int x,int root){
	if(root==0){
		return 0;
	}
	if(x==0){
		return 1;
	}
	if(a[root].val==x){
		return a[a[root].l].size+1;
	}
	if(a[root].val<x){
		return 1+a[a[root].l].size+rak(x,a[root].r);
	}
	if(a[root].val>x){
		return rak(x,a[root].l); 
	}
}
int answer(int rk,int root){
	if(a[a[root].l].size+1==rk){
		return a[root].val;
	}
	if(a[a[root].l].size+1<rk){
		return answer(rk-(a[a[root].l].size+1),a[root].r);
	}
	if(a[a[root].l].size+1>rk){
		return answer(rk,a[root].l);
	}
}
int lastone(int x,int root){
	int ans=-2147483647;
	if(x==0){
		return -2147483647;
	}
	if(a[root].val<x&&a[root].r!=0){
		ans=max(a[root].val,lastone(x,a[root].r));
		return ans;
	}
	else if(a[root].l!=0){
		ans=max(ans,lastone(x,a[root].l));
		return ans; 
	}
	else{
		if(a[root].val<x){
			ans=max(ans,a[root].val);
		}
		return ans;
	}
}
int nextone(int x,int root){
	int ans=2147483647;
	if(x==0){
		return 2147483647;
	}
	if(a[root].val>x&&a[root].l!=0){
		ans=min(a[root].val,nextone(x,a[root].l));
		return ans;
	}
	else if(a[root].r!=0){
		ans=min(ans,nextone(x,a[root].r));
		return ans; 
	}
	else{
		if(a[root].val>x){
			ans=min(ans,a[root].val);
		}
		return ans;
	}
}
void inser(int x,int root){
	a[root].size++;
	if(x>=a[root].val){
		if(a[root].r==0){
			a[root].r=tot;
			a[a[root].r]={0,0,tot,1,x};
			return;
		}
		inser(x,a[root].r);
		return;
	}
	else{
		if(a[root].l==0){
			a[root].l=tot;
			a[a[root].l]={0,0,tot,1,x};
			return;
		}
		inser(x,a[root].l);
		return;
	}
}
int main(){
	cin>>q;
	while(q--){
		int opt,x;
		cin>>opt>>x;
		if(opt==1){
			cout<<rak(x,1)<<endl;
		}
		if(opt==5){
			if(tot==1){
				a[tot]={0,0,1,1,x};
				tot++;
			}
			else{
				inser(x,1);
				tot++;
			}
		}
		if(opt==2){
			cout<<answer(x,1)<<endl;
		}
		if(opt==3){
			cout<<lastone(x,1)<<endl;
		}
		if(opt==4){
			cout<<nextone(x,1)<<endl;
		}
	}
	return 0;
}
2021/10/15 17:38
加载中...