WA on #7-#12
答案和1000行样例只差1个数QAQ
#include<iostream>
#include<algorithm>
using namespace std;
constexpr int N=1000010,INF=0x3f3f3f3f;
int n,op,x,root=0,idx;
struct node
{
int p,s[2];
int val,size,cnt;
}tr[N];
void clear(int u)//清空结点u
{
tr[u].p=tr[u].s[0]=tr[u].s[1]=0;
tr[u].val=tr[u].size=tr[u].cnt=0;
}
void add(int u,int v,int p)//初始化结点
{
tr[u].val=v,tr[u].p=p;
tr[u].size=tr[u].cnt=1;
}
void pushup(int u)
{
tr[u].size=tr[tr[u].s[0]].size+tr[u].cnt+tr[tr[u].s[1]].size;
return;
}
void rotate(int x)
{
int y=tr[x].p,z=tr[y].p;
int k= (tr[y].s[1]==x);
tr[tr[x].s[k^1]].p=y,tr[y].s[k]=tr[x].s[k^1];
tr[y].p=x,tr[x].s[k^1]=y;
tr[x].p=z,tr[z].s[y==tr[z].s[1]]=x;
pushup(y),pushup(x);
}
void splay(int x,int k)
{
while(tr[x].p!=k)
{
int y=tr[x].p,z=tr[y].p;
if(z!=k)
if((x==tr[y].s[1])^(y==tr[z].s[1]))rotate(x);
else rotate(y);
rotate(x);
}
if(!k)root=x;
}
int get_pre()//找到根节点的前驱
{
int x=tr[root].s[0];
while(tr[x].s[1])x=tr[x].s[1];
return x;
}
int get_next()
{
int x=tr[root].s[1];
while(tr[x].s[0])x=tr[x].s[0];
return x;
}
void insert(int v)
{
int u=root,p=0;
while(u)
{
p=u,u=tr[u].s[v>tr[u].val];
}
u=++idx;
if(p)tr[p].s[v>tr[p].val]=u;
add(u,v,p);
splay(u,0);
}
int get_key_by_rank(int rank)//通过排名找数值
{
int u=root;
while(true)
{
if(tr[u].s[0]&&tr[tr[u].s[0]].size>=rank)u=tr[u].s[0];
else if(tr[tr[u].s[0]].size+tr[u].cnt>=rank)
{
return u;
}
else
{
rank=rank-tr[tr[u].s[0]].size-tr[u].cnt;
u=tr[u].s[1];
}
}
}
int get_rank_by_key(int v)
{
int u=root,ans=0;
while(u)
{
if(tr[u].val>v)u=tr[u].s[0];
else
{
if(tr[u].s[0])ans+=tr[tr[u].s[0]].size;
if(tr[u].val==v)
{
splay(u,0);
return ans+1;
}
ans+=tr[u].cnt;
u=tr[u].s[1];
}
}
return ans+1;
}
void remove(int x)//删除
{
get_rank_by_key(x);
if(tr[root].cnt>1)
{
tr[root].cnt--;
pushup(root);
return;
}
if(!tr[root].s[0]&&!tr[root].s[1])
{
clear(root);
root=0;
return;
}
if(!tr[root].s[1])
{
int z=root;
root=tr[root].s[0];
tr[root].p=0;
clear(z);
return;
}
if(!tr[root].s[0])
{
int z=root;
root=tr[root].s[1];
tr[root].p=0;
clear(z);
return;
}
int pre=get_pre(),z=root;
splay(pre,0);
tr[root].s[1]=tr[z].s[1];
tr[tr[root].s[1]].p=root;
clear(z);
pushup(root);
return;
}
int main()
{
cin>>n;
while(n--)
{
cin>>op>>x;
if(op==1)insert(x);
else if(op==2)remove(x);
else if(op==3)cout<<get_rank_by_key(x)<<"\n";
else if(op==4)cout<<tr[get_key_by_rank(x)].val<<"\n";
else if(op==5)
{
insert(x);
cout<<tr[get_pre()].val<<"\n";
remove(x);
}
else if(op==6)
{
insert(x);
cout<<tr[get_next()].val<<"\n";
remove(x);
}
else cout<<"Error_input\n";
}
return 0;
}