rt,评测记录,Code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define N 100005
const int inf=0x3f3f3f3f;
int T,tot=0,root=0,key[N],size[N],lson[N],rson[N];
void output_num(int p) //从小到大输出 (中序遍历) 以 p 为根的子树中每个节点的值
{
if(!p)
{
return;
}
output_num(lson[p]);
cout<<key[p]<<",";
output_num(rson[p]);
}
void output_node(int p) //输出 (前序遍历) 以 p 为根的子树中每个节点
{
if(!p)
{
return;
}
cout<<p<<"位置: key="<<key[p]<<" size="<<size[p]<<" lson="<<lson[p]<<" rson="<<rson[p]<<"\n";
output_node(lson[p]);
output_node(rson[p]);
}
void L_rotate(int &p) //对节点 p 左旋
{
// cout<<"L("<<p<<")\n";
int k = rson[p];
rson[p] = lson[k];
lson[k] = p;
size[k] = size[p];
size[p] = size[lson[p]] + size[rson[p]] + 1;
p = k;
}
void R_rotate(int &p) //对节点 p 右旋
{
// cout<<"R("<<p<<")\n";
int k = lson[p];
lson[p] = rson[k];
rson[k] = p;
size[k] = size[p];
size[p] = size[lson[p]] + size[rson[p]] + 1;
p = k;
}
void maintain(int &p,bool flag) //维护节点 p 的平衡性
{
if(!p)
{
return;
}
int l=lson[p], r=rson[p], sl=size[l], sr=size[r];
if(!flag)
{
if(size[rson[r]] > sl)
{
L_rotate(p);
}
else if(size[lson[l]] > sr)
{
R_rotate(p);
}
else
{
return;
}
}
else
{
if(size[rson[l]] > sr)
{
L_rotate(lson[p]);
R_rotate(p);
}
else if(size[lson[r]] > sl)
{
R_rotate(rson[p]);
L_rotate(p);
}
else
{
return;
}
}
maintain(lson[p],0);
maintain(rson[p],1);
maintain(p,0);
maintain(p,1);
}
void insert(int &p,int v) //在以 p 为根的子树里插入 v
{
if(size[p]==0)
{
p=0;
}
// cout<<"insert("<<p<<","<<v<<")\n";
if(!p)
{
p=++tot;
key[p]=v;
size[p]=1;
lson[p]=rson[p]=0;
// cout<<p<<"位置: key="<<key[p]<<"\n";
}
else
{
size[p]++;
if(v < key[p])
{
insert(lson[p],v);
// cout<<"lson["<<p<<"]="<<lson[p]<<"\n";
}
else
{
insert(rson[p],v);
// cout<<"rson["<<p<<"]="<<rson[p]<<"\n";
}
maintain(p,v>=key[p]);
}
}
int maxNode(int p) //查找以 p 为根的子树里值最大的节点
{
while(rson[p])
{
p=rson[p];
}
return p;
}
void remove(int &p,int v) //删除在以 p 为根的子树里值为 v 的节点
{
if(!p)
{
return;
}
// cout<<"remove("<<p<<","<<v<<")\n";
if(key[p]==v)
{
int ret=key[p];
if(!lson[p] || !rson[p])
{
p=lson[p]+rson[p];
// cout<<"p="<<p<<"\n";
}
else
{
int tmp=maxNode(lson[p]);
remove(lson[p],key[tmp]);
lson[tmp]=lson[p];
rson[tmp]=rson[p];
p=tmp;
// cout<<"tmp="<<tmp<<" lson[p]="<<lson[p]<<" rson[p]="<<rson[p]<<" size[p]="<<size[p]<<"\n";
size[p]=size[lson[p]]+size[rson[p]];
}
return;
}
size[p]--;
if(v<key[p])
{
remove(lson[p],v);
}
else
{
remove(rson[p],v);
}
}
int rnk(int p,int v) //查询在以 p 为根的子树里值为 v 的节点的排名
{
if(size[p]==0)
{
p=0;
}
if(!p)
{
return 1;
}
if(v<=key[p])
{
return rnk(lson[p],v);
}
return size[lson[p]] + 1 + rnk(rson[p],v);
}
int kth(int p,int k) //查询在以 p 为根的子树里排名为 k 的节点的值
{
int s=size[lson[p]]+1;
if(s==k)
{
return key[p];
}
if(s>k)
{
return kth(lson[p],k);
}
return kth(rson[p],k-s);
}
int prec(int p,int v) //查询在以 p 为根的子树里值为 v 的节点的前驱
{
if(!p)
{
return inf;
}
if(v<=key[p])
{
return prec(lson[p],v);
}
int k=prec(rson[p],v);
return (k^inf ? k : key[p]);
}
int succ(int p,int v) //查询在以 p 为根的子树里值为 v 的节点的后继
{
if(!p)
{
return inf;
}
if(v>=key[p])
{
return succ(rson[p],v);
}
int k=succ(lson[p],v);
return (k^inf ? k : key[p]);
}
signed main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
cin>>T;
while(T--)
{
int op,x;
cin>>op>>x;
if(op==1)
{
insert(root,x);
output_num(root);
cout<<"\n";
output_node(root);
}
else if(op==2)
{
remove(root,x);
output_num(root);
cout<<"\n";
output_node(root);
}
else if(op==3)
{
cout<<rnk(root,x)<<"\n";
}
else if(op==4)
{
cout<<kth(root,x)<<"\n";
}
else if(op==5)
{
cout<<prec(root,x)<<"\n";
}
else
{
cout<<succ(root,x)<<"\n";
}
}
return 0;
}