人傻了
查看原帖
人傻了
389372
JL_Lee楼主2021/7/31 19:07

求助 看了题解之后打的代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stdio.h>
using namespace std;
const int INF=0x7fffffff;
struct node{
	int val;
	int ls,rs;
	int cnt;
	int size;
};
//
int cont;
int n,opr,xx;
node tree[1000000000];

//-----------------------------函数-------------------------------------

void addval(int a,int v){
	tree[a].size++;
	if(tree[a].val==v){
		tree[a].cnt++;
		return ;
	}
	if(tree[a].val>v){//V in A's left tree.
		if(tree[a].ls!=0){
		  addval(tree[a].ls,v);//
		}
		else{
			cont++;
			tree[cont].val=v;
			tree[cont].size=tree[cont].cnt=1;
			tree[a].ls=cont;
		}
	}else{//In right tree.
		if(tree[a].rs!=0)
		  addval(tree[a].rs,v);
		else{
			cont++;
			tree[cont].val=v;
			tree[cont].size=tree[cont].cnt=1;
			tree[a].rs=cont;
		}
	}
}
//--------------------
int findfront(int a,int val,int ans){
	if(tree[a].val>val){//left.
		if (tree[a].ls==0){//no tree.
			return ans;
		}else{//find left(next).
			return findfront(tree[a].ls,val,ans);
		}
	}
	else{//right.
		if(tree[a].rs==0){
			return (tree[a].val<val)?tree[a].val:ans;
		}
		if(tree[a].cnt!=0){
			return findfront(tree[a].rs,val,tree[a].val);
		}
		else{
			return findfront(tree[a].rs,val,ans);
		}
	}
}
//--------------------
int findback(int a,int val,int ans){
	if(tree[a].val<val){
		if (tree[a].rs==0){
			return ans;
		}else{
			return findback(tree[a].rs,val,ans);
		}
	}
	else{
		if(tree[a].ls==0){
			return (tree[a].val>val)?tree[a].val:ans;
		}
		if(tree[a].cnt!=0){
			return findback(tree[a].ls,val,tree[a].val);
		}
		else{
			return findback(tree[a].ls,val,ans);
		}
	}
}
//--------------------
int findval(int a,int val){
	if(a==0){
		return 0;
	}
	if(val==tree[a].val){
		return tree[tree[a].ls].size;
	}
	if(val<tree[a].val){
		return findval(tree[a].ls,val);
	}
	return findval(tree[a].rs,val)+tree[tree[a].ls].size+tree[a].cnt;
}
//--------------------
int findrank(int a,int val){
	if(a==0){
		return INF;
	}
	if(val==tree[a].val){
	return tree[tree[a].ls].size;//left
	}
	if(val<tree[a].val){
		return findrank(tree[a].ls,val);
	}
	return findrank(tree[a].rs,val)+tree[tree[a].ls].size+tree[a].cnt;
}

//---------------------------------------------------------------------

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
inline void write(int x){
    char F[200];
    int tmp=x>0?x:-x ;
    if(x<0)putchar('-') ;
    int cnt=0 ;
       while(tmp>0){
           F[cnt++]=tmp%10+'0';
           tmp/=10;
       }
       while(cnt>0)putchar(F[--cnt]) ;
}
int main(){
	n=read();
    while(n--){
        opr=read();xx=read();
        if(opr==1){
			printf("%d\n",findval(1,xx)+1);
		}
        else if(opr==2){
			printf("%d\n",findrank(1,xx));
		}
        else if(opr==3){
			printf("%d\n",findfront(1,xx,-INF));
		}
        else if(opr==4){
        	printf("%d\n",findback(1,xx,INF));
        }
        else{
            if(cont==0){
                cont++;
                tree[cont].cnt=tree[cont].size=1;
                tree[cont].val=xx;
            }
            else addval(1,xx);
        }
    }
	return 0;
}
2021/7/31 19:07
加载中...