平衡树板子,样例和前两个数据都过了,后面都RE了。 不懂为什么RE;求助
#include<bits/stdc++.h>
#define N 100005
#define amax 10000005
using namespace std;
struct Node{
int value;
int ch[2];
int height;
int size;//存储当前根节点所有节点的数量
}Tree[N];
int n;
int cnt = 0;
int diffh(int p){return Tree[Tree[p].ch[0]].height-Tree[Tree[p].ch[1]].height;}
void zs(int p){Tree[p].size=0;Tree[p].height=0;Tree[p].value=0;}
void deletP(int f,int p);
void deletP2(int f,int p,int xp);
void updatehs(int p){//更新节点高度和节点数量
Tree[p].height=max(Tree[Tree[p].ch[0]].height,Tree[Tree[p].ch[1]].height)+1;
Tree[p].size=Tree[Tree[p].ch[0]].size+Tree[Tree[p].ch[1]].size+1;
}
int transr(int p){
int rt = Tree[p].ch[0];
int newleft=Tree[rt].ch[1];
Tree[rt].ch[1]=p;
Tree[p].ch[0]=newleft;
updatehs(p);
updatehs(rt);
return rt;
}
int transl(int p){
int rt=Tree[p].ch[1];
int newright=Tree[rt].ch[0];
Tree[rt].ch[0]=p;
Tree[p].ch[1]=newright;
updatehs(p);
updatehs(rt);
return rt;
}
int findl(int p,int x,int nans){
if(Tree[p].height==0)return nans;
if(Tree[p].value>=x)findl(Tree[p].ch[0],x,nans);
else nans=max(nans,Tree[p].value),findl(Tree[p].ch[1],x,nans);
}
int findr(int p,int x,int nans){
if(Tree[p].height==0)return nans;
if(Tree[p].value>x)nans=min(nans,Tree[p].value),findr(Tree[p].ch[0],x,nans);
else findr(Tree[p].ch[1],x,nans);
}
void correct(int f,int p){
int d=Tree[f].ch[0]==p?0:1;
if(diffh(p)==2&&diffh(Tree[p].ch[0])==1)Tree[f].ch[d]=transr(p);
if(diffh(p)==-2&&diffh(Tree[p].ch[1])==-1)Tree[f].ch[d]=transl(p);
if(diffh(p)==2&&diffh(Tree[p].ch[0])==-1)Tree[p].ch[0]=transl(Tree[p].ch[0]),Tree[f].ch[d]=transr(p);
if(diffh(p)==-2&&diffh(Tree[p].ch[1])==1)Tree[p].ch[1]=transr(Tree[p].ch[1]),Tree[f].ch[d]=transl(p);
}
void display(int a){
if(a==0)return;
display(Tree[a].ch[0]);
printf("data: %d %d %d %d %d %d\n",a,Tree[a].value,Tree[Tree[a].ch[0]].value,Tree[Tree[a].ch[1]].value,Tree[a].height,Tree[a].size);
display(Tree[a].ch[1]);
}
void insert(int f,int p,int d,int value){
if(Tree[p].height==0){
Tree[cnt].value=value;
Tree[cnt].height=1;
Tree[cnt].size=1;
Tree[f].ch[d]=cnt;
return;
}
if(value>=Tree[p].value)insert(p,Tree[p].ch[1],1,value);
else insert(p,Tree[p].ch[0],0,value);
correct(f,p);
updatehs(p);
}
void deletP(int f,int p){
int pl=Tree[p].ch[0];
int pr=Tree[p].ch[1];
int judge=(bool)pl+(bool)pr;
int d=Tree[f].ch[0]==p?0:1;
if(judge==0)Tree[f].ch[d]=0,zs(p);
else if(judge==1)Tree[f].ch[d]=pl+pr,zs(p);
else deletP2(p,Tree[p].ch[1],p);
correct(f,p);
}
void deletP2(int f,int p,int xp){
if(Tree[p].ch[0]!=0)deletP2(p,Tree[p].ch[0],xp);
else Tree[xp].value=Tree[p].value,deletP(f,p);
correct(f,p);
}
void delet(int f,int p,int x){
if(Tree[p].value==x)deletP(f,p);
else if(Tree[p].value>x)delet(p,Tree[p].ch[0],x);
else delet(p,Tree[p].ch[1],x);
correct(f,p);
}
int rankx(int p,int x){
//printf("%d %d\n",p,Tree[Tree[p].ch[0]].size);
if(p==0)return 1;
if(x<Tree[p].value)return rankx(Tree[p].ch[0],x);
else if(x>Tree[p].value)return 1+Tree[Tree[p].ch[0]].size+rankx(Tree[p].ch[1],x);
else return Tree[p].size+1;
}
int rankr(int p,int rx,int nowrank){
int rankp=nowrank+Tree[Tree[p].ch[0]].size+1;
if(rx==rankp)return Tree[p].value;
else if(rx<rankp)return rankr(Tree[p].ch[0],rx,nowrank);
else return rankr(Tree[p].ch[1],rx,rankp);
}
int main(){
Tree[0].ch[0]=1;
scanf("%d",&n);
int op,num;
for(int i = 1;i<=n;i++){
scanf("%d%d",&op,&num);
switch (op){
case 1:cnt++;insert(0,Tree[0].ch[0],0,num);break;
case 2:delet(0,Tree[0].ch[0],num);break;
case 3:printf("%d\n",rankx(Tree[0].ch[0],num));break;
case 4:printf("%d\n",rankr(Tree[0].ch[0],num,0));break;
case 5:printf("%d\n",findl(Tree[0].ch[0],num,-amax));break;
case 6:printf("%d\n",findr(Tree[0].ch[0],num,amax));break;
default:break;
}
}
system("pause");
return 0;
}