题意:裸的平衡树题
平衡树功能:插入,删除最大,删除最小
挂一个SBT模板吧,明天就校赛了,所以重写了一下SBT,把原来的删除操作改了下:
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN = 1111111,INF = 10000001;
struct Key{
int k,p;
Key(){}
Key(int kk,int pp):k(kk),p(pp){}
bool operator < (const Key &ke) const{
return p<ke.p;
}
bool operator >= (const Key &ke) const{
return !(*this<ke);
}
bool operator == (const Key &ke) const{
return p==ke.p;
}
}k[MAXN];
int l[MAXN],r[MAXN],pool[MAXN],size[MAXN],T,top,node;
void build(){
T = top = node = 0;
}
void left_rotate(int &x){
int q = r[x];
r[x] = l[q];
l[q] = x;
size[q] = size[x];
size[x] = size[l[x]]+size[r[x]]+1;
x = q;
}
void right_rotate(int &x){
int q = l[x];
l[x] = r[q];
r[q] = x;
size[q] = size[x];
size[x] = size[l[x]]+size[r[x]]+1;
x = q;
}
int newnode(Key key){
int x;
if(top!=0){
x = pool[--top];
}else{
x = ++node;
}
k[x] = key;
size[x] = 1; l[x] = r[x] = 0;
return x;
}
void delnode(int x){
pool[top++] = x;
size[x] = l[x] = r[x] = 0;
}
void Maintain(int &T,bool flag){
if(!flag){
if(size[l[l[T]]]>size[r[T]]){
right_rotate(T);
}else if(size[r[l[T]]]>size[r[T]]){
left_rotate(l[T]);
right_rotate(T);
}else{
return;
}
}else{
if(size[r[r[T]]]>size[l[T]]){
left_rotate(T);
}else if(size[l[r[T]]]>size[l[T]]){
right_rotate(r[T]);
left_rotate(T);
}else{
return;
}
}
Maintain(l[T],0);
Maintain(r[T],1);
Maintain(T,0);
Maintain(T,1);
}
void Insert(int &T,Key key){
if(!T){
T = newnode(key);
return;
}
size[T]++;
if(key<k[T])Insert(l[T],key);
else Insert(r[T],key);
Maintain(T,key>=k[T]);
}
Key Delete(int &T,Key key){
if(!T)return Key(INF,INF);//no element to delete
size[T]--;
if((key==k[T])||(key<k[T]&&l[T]==0)||(key>=k[T]&&r[T]==0)){
Key ret = k[T]; int x = T;
if(l[T]==0||r[T]==0){
T = l[T]+r[T];
delnode(x);//释放结点内存
}else{
key.p++;
k[T] = Delete(r[T],key);
}
return ret;
}
if(key<k[T])Delete(l[T],key);
else Delete(r[T],key);
}
Key DeleteMax(int &T){
if(!T)return Key(INF,INF);
if(r[T])return DeleteMax(r[T]);
int x = T; Key key = k[T];
T = l[T];
delnode(x);
return key;
}
Key DeleteMin(int &T){
if(!T)return Key(INF,INF);
if(l[T])return DeleteMin(l[T]);
int x = T; Key key = k[T];
T = r[T];
delnode(x);
return key;
}
Key Select(int T,int st){
if(!T)return Key(INF,INF);
int rank = size[l[T]]+1;
if(st==rank)return k[T];
else if(st<rank)return Select(l[T],st);
else return Select(r[T],st-rank);
}
int Rank(int T,Key key){
if(!T)return -1;
if(key==k[T])return size[l[T]]+1;
else if(key<K[T])return Rank(l[T],key);
else return size[l[T]]+1+Rank(r[T],key);
}
int main(){
int op,rst,sec;
build();
//freopen("out.txt","w",stdout);
while(scanf("%d",&op),op){
if(op==1){
scanf("%d%d",&rst,&sec);
Insert(T,Key(rst,sec));
}else if(op==2){
Key key = Select(T,size[T]);
if(key.k==INF)printf("0\n");
else printf("%d\n",key.k);
Delete(T,key);
}else{
Key key = Select(T,1);
if(key.k==INF)printf("0\n");
else printf("%d\n",key.k);
Delete(T,key);
}
}
return 0;
}
分享到:
相关推荐
将bst文件放到MiKTeX的bst文件夹下自己新建的gbt7714-2005文件下,1)作者名称如 KERNER B S 的样式 GBT7714-2005NLang.bst 2)作者名称如 KERNER B S 的样式 GBT7714-2005NLang_UP.bst 3)作者名称如 Kerner B S 的...
BME280 The BME280 is an integrated environmental sensor developed specifically for mobile applications where size and low power consumption are key design constraints. The unit combines individual ...
在本压缩包中,我们聚焦于51单片机编程,特别是BST-V51型号的51单片机。这个集合包含了大量的实例代码,旨在帮助开发者深入理解和掌握51单片机的使用,以及与其相关的IIC接口和数码管显示技术。 首先,"51代码"是指...
BST-BMP180-DS000-08.zip 文件包含了有关 BMP180 气体传感器的详细信息,这款传感器由 BOSCH 公司生产,主要用于环境温度和气压的精确测量。BMP180 是一款集成度高、性能稳定的传感器,广泛应用于气象站、智能家居、...
根据提供的文档信息,我们可以了解到BMP180是一款由Bosch Sensortec生产的数字压力传感器。接下来将详细解析此产品的关键特点、技术规格及应用领域等知识点。 ### 关键特性 1. **压力范围**:300至1100 hPa,相当...
根据提供的信息,我们可以了解到这是一份关于bst-4wd+V4.0发行版1的文档,主要关注的是与stm32微控制器相关的硬件设计细节。由于提供的文档内容较为复杂且部分信息不易解读,以下将重点围绕标题、描述以及部分可见...
在这个项目中,数码管被连接到BST-M51微控制器,这是一款基于MCU的集成芯片,能够处理计时器的逻辑和显示控制。 BST-M51计时器是基于BST(BestSemiconductor Technology)公司的一款微控制器,该控制器具有高性能、...
### BST-V51智能小车底板电路原理图 #### 一、整体概述 BST-V51智能小车是一款集成了多种传感器与执行器的智能设备,主要用于教育及科研领域。其底板电路原理图展示了该智能小车的核心硬件设计,包括舵机供电模块、...
亚博智能BST-M51学习板是一款用于教育和实验目的的微控制器开发平台,它基于STC公司的M51系列单片机。这个压缩包包含了几个关键的源代码文件,帮助用户快速理解和应用BST-M51学习板上的功能。下面我们将详细探讨这些...
视频,源代码,光盘配套一切资料
bst-bmi270-sf000 数据手册1 本资源手册对应的是Bosch Sensortec的BMI270uttle板3.0的数据手册,主要介绍了该板的概况、电气布局、引脚定义等信息。 知识点1:BMI270 Shuttle Board 3.0概况 * BMI270 Shuttle ...
- 二叉查找树(Binary Search Tree,BST):对于任意一个节点,其左子树中的所有节点的值均小于它的值,而右子树中的所有节点的值均大于它的值。 - 平衡二叉搜索树(Balanced Binary Search Tree):在二叉查找树...
### 从BST到SBT:深入理解二叉搜索树及自平衡二叉搜索树 #### 1. 引言 在计算机科学领域中,数据结构的设计对于提高算法效率至关重要。其中,二叉搜索树(Binary Search Tree, BST)作为一种基本且高效的数据结构,...
`BST.rar_c++ tree node_read-bst-1`这个文件名可能是指包含了C++实现二叉搜索树节点读取的代码,具体实现可能涉及对二进制文件的读取和解析,以便于存储和恢复树的状态。 6. **应用**: 二叉搜索树广泛应用于...
在C语言中,树结构如二叉搜索树(BST)可以用来快速查找、插入和删除数据。AVL树是一种自平衡的二叉搜索树,确保任何节点的两个子树高度差不超过1,从而保证了搜索效率。红黑树则是一种弱平衡的二叉查找树,其特性是...
《BMP280数字压力传感器数据手册》是Bosch Sensortec公司发布的一份技术参考资料,文档编号BST-BMP280-DS001-12,修订版本为1.15,发布日期为2015年10月15日。该手册详细介绍了BMP280这款数字压力传感器的关键参数和...
**BST-BMP280-DS001-11.zip** 包含的是BOSCH Sensortec公司的BMP280传感器的数据手册。**BMP280** 是一款高度集成的数字压力和温度传感器,广泛应用于气象、环境监测、物联网设备以及消费电子产品中。这份数据手册是...
包含如下操作系统版本 FreeBSD Linux Solaris Windows 分别对应如下目录 MegaCLI for DOS MegaCLI for Linux MegaCLI for Solaris MegaCLI for FreeBSD MegaCLI for Windows ********************************...
BMI088是一款六轴运动追踪的惯性测量单元(IMU),能够检测六个自由度(6DoF)内的移动和旋转。它集成了两个惯性传感器的功能于一个设备中:一个先进的三轴16位陀螺仪和一个多功能的、领先的三轴16位加速度计。...