MLE求助
查看原帖
MLE求助
299883
HYdroKomide楼主2021/5/25 22:53

RT,开O2会TLE,不开会MLE

#include<cstdio>
using namespace std;
struct node{int l,r,size,val;}tree[10001];
int q,n,d,x,y;
inline int readInt(){
    int x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*f;
}
inline int find(int x, int s){
	if(tree[x].val==s)return tree[tree[x].l].size+1;
	if(s<tree[x].val)return find(tree[x].l,s);
	else return tree[tree[x].l].size+1+find(tree[x].r,s);
}
inline int lookup(int x, int k){
	if(k<1||k>tree[x].size)return -1;
	if(k==tree[tree[x].l].size+1)return tree[x].val;
	if(k<=tree[tree[x].l].size)return lookup(tree[x].l,k);
	else return lookup(tree[x].r,k-tree[tree[x].l].size-1);
}
inline int newnode(int s){
	tree[++n].val=s;
	tree[n].size=1;
	return n;
}
inline void insert(int x,int s){
	if(s<tree[x].val){
		if(tree[x].l)insert(tree[x].l,s);
		else tree[x].l=newnode(s);
	}
	else if(s>tree[x].val){
		if(tree[x].r)insert(tree[x].r,s);
		else tree[x].r=newnode(s);
	}
	tree[x].size=tree[tree[x].l].size+tree[tree[x].r].size+1;
}

int main(){
	q=readInt();
	while(q--){
		d=readInt(),x=readInt();
		switch(d){
			case 1:printf("%d\n",find(1,x));break;
			case 2:printf("%d\n",lookup(1,x));break;
			case 3:printf("%d\n",lookup(1,find(1,x)-1));break;
			case 4:printf("%d\n",lookup(1,find(1,x)+1));break;
			case 5:if(!n)newnode(x);else insert(1, x);break;
		}
	}
	return 0;
}
2021/5/25 22:53
加载中...