当前位置: 首页 > news >正文

BST(self saved)

#include<iostream>
#include<cstdio>
using namespace std;
int root,tot;
struct bst
{int v,l,r,vnum,lnum;bst(){v=l=r=vnum=lnum=0;}void nw(int a){v=a;vnum=1;lnum=0;l=r=0;}
}tree[1000010];
struct nd
{int v,idx,fa;nd(){v=idx=fa=0;}nd(int a,int b,int c){v=a;idx=b;fa=c;}
};
nd prs(int p,int fa)//前驱 
{if(tree[p].r)return prs(tree[p].r,p);return nd(tree[p].v,p,fa);
}
int suc(int p)//后继 
{if(tree[p].l)return suc(tree[p].l);return tree[p].v;
}
void ist(int p,int tmp)
{if(p==0){p=root=++tot;tree[p].nw(tmp);return ;}if(tmp==tree[p].v)tree[p].vnum++;if(tmp<tree[p].v){tree[p].lnum++;if(!tree[p].l){tree[p].l=++tot;tree[tot].nw(tmp);}elseist(tree[p].l,tmp);}if(tmp>tree[p].v){if(!tree[p].r){tree[p].r=++tot;tree[tot].nw(tmp);}elseist(tree[p].r,tmp);}
}
void ck(int p=1)
{int ls=tree[p].l,rs=tree[p].r;if(ls)ck(ls);cout<<tree[p].v<<" "<<tree[p].vnum<<"\n";if(rs)ck(rs);
}
int ck_lnum(int p,int tmp)
{if(tree[p].v>=tmp&&tree[tree[p].l].v<tmp)return tree[p].lnum;if(tree[p].v>=tmp)return ck_lnum(tree[p].l,tmp);return ck_lnum(tree[p].r,tmp)+1;
}
int dt(int p)//结点p删除 , 返回新结点下标 
{int ls=tree[p].l,rs=tree[p].r;if((!ls)&&(!rs))return 0;if((!ls)||(!rs))return ls|rs;nd ps=prs(tree[p].l,p);if(tree[ps.fa].l==ps.idx)tree[ps.fa].l=0;elsetree[ps.fa].r=0;return ps.idx;
}
void dlt(int p,int tmp)
{int ls=tree[p].l,rs=tree[p].r;if(tree[p].v==tmp)//删到根了 {tree[p].vnum--;if(!tree[p].vnum)root=dt(p);}else if(tmp<tree[p].v){tree[p].lnum--;if(tmp==tree[ls].v)tree[ls].vnum--;if(!tree[ls].vnum)//删除结点 {int tp=dt(ls);tree[tp].l=tree[ls].l;tree[tp].r=tree[ls].r;tree[p].l=tp;}elsedlt(ls,tmp);}else{if(tmp==tree[rs].v)tree[rs].vnum--;if(!tree[rs].vnum)//删除结点 {int tp=dt(rs);tree[tp].l=tree[rs].l;tree[tp].r=tree[rs].r;tree[p].r=tp;}elsedlt(rs,tmp);}ls=tree[p].l;rs=tree[p].r;
}
int get_prs(int p,int tmp)
{if(p==0)return -(int)1e9;if(tree[p].v<tmp)return max(tree[p].v,get_prs(tree[p].r,tmp));elsereturn get_prs(tree[p].l,tmp);
}
int get_suc(int p,int tmp)
{if(p==0)return (int)1e9;if(tree[p].v>tmp)return min(tree[p].v,get_suc(tree[p].l,tmp));elsereturn get_suc(tree[p].r,tmp);
}
int ck_top(int p,int tmp)
{if(tree[p].lnum+1==tmp)return tree[p].v;else if(tree[p].lnum+1>tmp)return ck_top(tree[p].r,tree[p].lnum+1-tmp);elsereturn ck_top(tree[p].l,tmp);
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);//freopen("t.in","r",stdin);int m;cin>>m;while(m--){int op,x;cin>>op>>x;if(op==1)ist(root,x);if(op==2)dlt(root,x);if(op==3)cout<<ck_lnum(root,x)+1<<'\n';if(op==4)cout<<ck_top(root,x)<<'\n';if(op==5)cout<<get_prs(root,x)<<'\n'; if(op==6)cout<<get_suc(root,x)<<'\n';}}
http://www.jsqmd.com/news/6302/

相关文章:

  • jenkins 用户权限 管理配置
  • DirectX- DLL修复工具 免费下载!绿色单文件版!安装使用教程
  • 测试集成CI/CD的五大实践:构建高效质量保障体系
  • Windows系统Web UI自动化测试学习系列4--开源体系平台测试项目环境部署搭建
  • DirectX修复工具官方中文增强版下载!下载安装教程(附安装包),0xc000007b错误解决办法
  • kuboard使用的etcd空间清理(3个etcd)
  • Node生态中最优雅的数据库事务处理机制
  • 详细介绍:扒透 STL 底层!map/set 如何封装红黑树?迭代器逻辑 + 键值限制全手撕----《Hello C++ Wrold!》(23)--(C/C++)
  • 死锁的处理策略-预防死锁
  • 跨网文件安全交换系统:提升数据传输安全性和合规性
  • ArcGIS 公众号推荐
  • 跨网文件交换系统:数字化时代企业与机构的数据安全传输利器
  • 缩放 div
  • Redis从零讲解 - 详解
  • 【2025-09-29】团队合作
  • 杂凑算法学习笔记
  • pg库支持扩展postgis
  • kuboard部署启用3个etcd(k8s单个master)
  • odoo18应用、队列服务器分离(SSHFS) - 详解
  • 数据库服务分布架构(MyCAT)
  • 题解:P14038 [PAIO 2025] Adventure Plan
  • 20231414_王仕琪_密码技术密码杂凑算法学习笔记
  • 调度算法易错概念总结
  • 堆设置了8G,java进程却占用了12G内存
  • Huxe 推出主动式 AI 音频服务,无感内容消费;OpenAI 推出 ChatGPT Pulse:主动提供个性化信息丨日报
  • C++学习:C++类型转换专栏 - 指南
  • NAFNet (Simple Baselines for Image Restoration) 阅读笔记 - 教程
  • 解决OpenWrt系统上出现“git: remote-https is not a git command...”的问题
  • 密码技术概论
  • IntelliJ IDEA 中 Shared Build Process Heap Size 的重要性与配置