新建结点
int cnt,root;
inline int newnode(int val){
fhq[++cnt].val=val;
fhq[cnt].key=rand();
fhq[cnt].size=1;
return cnt;
}
按权分裂
void split(int now,int val,int &x,int &y){
if(!now)x=y=0;
else {
if(fhq[now].val<=val){
x=now;
split(fhq[now].r,val,fhq[now].r,y);
}else {
y=now;
split(fhq[now].l,val,x,fhq[now].l);
}
update(now);
}
}
按大小分裂
void split(int now,int sz,int &x,int &y){
if(!now)x=y=0;
else {
if(fhq[now].tag)pushdown(now);
if(fhq[ls].size<sz){
x=now;
split(rs,sz-fhq[ls].size-1,rs,y);
}else {
y=now;
split(ls,sz,x,ls);
}
pushup(now);
}
}
合并
int merge(int x,int y){
if(!x||!y)return x+y;
if(fhq[x].key>fhq[y].key){
fhq[x].r=merge(fhq[x].r,y);
update(x);return x;
}else {
fhq[y].l=merge(x,fhq[y].l);
update(y);return y;
}
}
插入
inline void ins(int val,int x,int y){
split(root,val,x,y);
root=merge(merge(x,newnode(val)),y);
}
删除
inline void del(int val,int x,int y,int z){
split(root,val,x,z);
split(x,val-1,x,y);
y=merge(fhq[y].l,fhq[y].r);
root=merge(merge(x,y),z);
}
查 rank
inline void rank(int val,int x,int y){
split(root,val-1,x,y);
printf("%d\n",fhq[x].size+1);
root=merge(x,y);
}
前驱后继
inline void pre(int val,int x,int y){
split(root,val-1,x,y);
int now=x;
while(fhq[now].r)now=fhq[now].r;
printf("%d\n",fhq[now].val);
root=merge(x,y);
}
inline void nxt(int val,int x,int y){
split(root,val,x,y);
int now=y;
while(fhq[now].l)now=fhq[now].l;
printf("%d\n",fhq[now].val);
root=merge(x,y);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】