全部MLE求助 用BST写的
查看原帖
全部MLE求助 用BST写的
13550
叶绿素楼主2020/5/22 20:35
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
int q,swi,x,lst,root;
struct node{
	int l,r,val,sum,cnt;
}t[maxn];
void insert(int &p,int a){
	if(!p){
		p=++lst;
		t[p].cnt=t[p].sum=1;
		t[p].val=a;
		return;
	}
	if(t[p].val==a){
		t[p].cnt++;t[p].sum++;
		return;
	}
	if(t[p].val>a)
		insert(t[p].l,a);
	else
		insert(t[p].r,a);
	t[p].sum=t[t[p].l].sum+t[t[p].r].sum+t[p].cnt;
}
int lev(int p,int a){
	int tmp=t[t[p].l].sum;
	if(t[p].val==a)
		return tmp+1;
	if(t[p].val>a)
		return lev(t[p].l,a);
	else
		return lev(t[p].r,a)+tmp+t[p].cnt;
}
int lvx(int p,int a){
	if(!p)return t[p].val;
	int tmp=t[t[p].l].sum;
	if(tmp>=a)
		return lvx(t[p].l,a);
	if(tmp<a&&tmp+t[p].cnt>=a)
		return t[p].val;
	if(tmp<a)
		return lvx(t[p].r,a-tmp-t[p].cnt);
}
int pre(int p,int a,int ans){
	if(!p)return ans;
	if(t[p].val>=a)
		return pre(t[p].l,a,ans);
	else
		return pre(t[p].r,a,t[p].val);
}
int bac(int p,int a,int ans){
	if(!p)return ans;
	if(t[p].val<=a)
		return bac(t[p].r,a,ans);
	else
		return bac(t[p].l,a,t[p].val);
}
int main(){
	insert(root,-0x7fffffff);
	insert(root,0x7fffffff);
	scanf("%d",&q);
	while(q--){
		scanf("%d%d",&swi,&x);
		switch(swi){
			case 1:{
				printf("%d\n",lev(root,x));
				break;
			}
			case 2:{
				printf("%d\n",lvx(root,x));
				break;
			}
			case 3:{
				printf("%d\n",pre(root,x,-0x3f3f3f3f));
				break;
			}
			case 4:{
				printf("%d\n",bac(root,x,0x3f3f3f3f));
				break;
			}
			case 5:{
				insert(root,x);
				break;
			}
		}
	}
	return 0;
}
2020/5/22 20:35
加载中...