这是一份AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct node{
int fa,son[2],val,num,sz;
void make(int _val,int _fa=0){
fa=_fa;val=_val;num++;son[0]=son[1]=0;
}
void clear(){
fa=son[0]=son[1]=val=num=sz=0;
return ;
}
}tr[N];
int rt,idx;
void maintain(int u){
tr[u].sz=tr[tr[u].son[0]].sz+tr[tr[u].son[1]].sz+tr[u].num;
return ;
}
int get(int u){
return u==tr[tr[u].fa].son[1];
}
void rotate(int u){
int v=tr[u].fa,w=tr[v].fa,chk=get(u);
tr[v].son[chk]=tr[u].son[chk^1];
if(tr[u].son[chk^1]){
tr[tr[u].son[chk^1]].fa=v;
}
tr[u].son[chk^1]=v;
tr[u].fa=w;
tr[v].fa=u;
if(w){
tr[w].son[v==tr[w].son[1]]=u;
}
maintain(u);
maintain(v);
return ;
}
void splay(int u){
int v=tr[u].fa;
while(v){
if(tr[v].fa){
if(get(u)==get(v)){
rotate(v);
}
else{
rotate(u);
}
}
rotate(u);
v=tr[u].fa;
}
rt=u;
return ;
}
int pre(){
int u=tr[rt].son[0];
if(!u){
return u;
}
while(tr[u].son[1]){
u=tr[u].son[1];
}
splay(u);
return u;
}
int nxt(){
int u=tr[rt].son[1];
if(!u){
return u;
}
while(tr[u].son[0]){
u=tr[u].son[0];
}
splay(u);
return u;
}
int getrank(int val){
int res=0,u=rt;
while(u){
if(val<tr[u].val){
u=tr[u].son[0];
}
else{
res+=tr[tr[u].son[0]].sz;
if(val==tr[u].val){
splay(u);
return res+1;
}
res+=tr[u].num;
u=tr[u].son[1];
}
}
return res+1;
}
int getkth(int k){
int u=rt;
while(1){
if(tr[u].son[0]!=0&&k<=tr[tr[u].son[0]].sz){
u=tr[u].son[0];
}
else{
k-=tr[u].num+tr[tr[u].son[0]].sz;
if(k<=0){
splay(u);
return tr[u].val;
}
u=tr[u].son[1];
}
}
}
void insert(int val){
if(!rt){
rt=++idx;
tr[rt].make(val);
maintain(rt);
return ;
}
int u=rt,p=0;
while(1){
if(tr[u].val==val){
tr[u].num++;
maintain(u);
maintain(p);
splay(u);
break;
}
p=u;
u=tr[u].son[tr[u].val<val];
if(!u){
tr[++idx].make(val,p);
tr[p].son[tr[p].val<val]=idx;
maintain(idx);
maintain(idx);
splay(idx);
break;
}
}
}
void delet(int val){
getrank(val);
if(tr[rt].num>1){
tr[rt].num--;
maintain(rt);
return ;
}
if(!tr[rt].son[0]&&!tr[rt].son[1]){
tr[rt].clear();
rt=0;
return ;
}
if(!tr[rt].son[0]){
int u=rt;
rt=tr[rt].son[1];
tr[rt].fa=0;
tr[u].clear();
return ;
}
if(!tr[rt].son[1]){
int u=rt;
rt=tr[rt].son[0];
tr[rt].fa=0;
tr[u].clear();
return ;
}
int u=rt;
int p=pre();
tr[tr[u].son[1]].fa=p;
tr[p].son[1]=tr[u].son[1];
tr[u].clear();
maintain(rt);
return ;
}
int getpre(int val){
insert(val);
int res=tr[pre()].val;
delet(val);
return res;
}
int getnxt(int val){
insert(val);
int res=tr[nxt()].val;
delet(val);
return res;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
int op,x;
cin>>op>>x;
switch(op){
case 1:
insert(x);
break;
case 2:
delet(x);
break;
case 3:
cout<<getrank(x)<<endl;
break;
case 4:
cout<<getkth(x)<<endl;
break;
case 5:
cout<<getpre(x)<<endl;
break;
case 6:
cout<<getnxt(x)<<endl;
break;
}
}
return 0;
}
将下面代码中第98行中
tr[u].son[0]!=0
改为
!tr[u].son[0]
就会WA
求原因