`
Coco_young
  • 浏览: 125775 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

[BST-SBT]POJ_3481_double queue

 
阅读更多

题意:裸的平衡树题

平衡树功能:插入,删除最大,删除最小

挂一个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;
}


分享到:
评论

相关推荐

    GBT7714-2005NLang_Upp.bst GBT7714-2005NLang_Up.bst GBT7714-2005NLang.bst

    将bst文件放到MiKTeX的bst文件夹下自己新建的gbt7714-2005文件下,1)作者名称如 KERNER B S 的样式 GBT7714-2005NLang.bst 2)作者名称如 KERNER B S 的样式 GBT7714-2005NLang_UP.bst 3)作者名称如 Kerner B S 的...

    BST-BME280_DS001-10.pdf

    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 ...

    5、步骤5 相关例程.zip_51单片机_BST-V51 51单片机_BST-V51程序_iic数码管

    在本压缩包中,我们聚焦于51单片机编程,特别是BST-V51型号的51单片机。这个集合包含了大量的实例代码,旨在帮助开发者深入理解和掌握51单片机的使用,以及与其相关的IIC接口和数码管显示技术。 首先,"51代码"是指...

    BST-BMP180-DS000-08.zip_BMP180_bmp180 a_bmp180pdf_bst-bmp180_气体传

    BST-BMP180-DS000-08.zip 文件包含了有关 BMP180 气体传感器的详细信息,这款传感器由 BOSCH 公司生产,主要用于环境温度和气压的精确测量。BMP180 是一款集成度高、性能稳定的传感器,广泛应用于气象站、智能家居、...

    BST-BMP180-DS000-07.pdf

    根据提供的文档信息,我们可以了解到BMP180是一款由Bosch Sensortec生产的数字压力传感器。接下来将详细解析此产品的关键特点、技术规格及应用领域等知识点。 ### 关键特性 1. **压力范围**:300至1100 hPa,相当...

    bst-4wd+V4.0发行版1

    根据提供的信息,我们可以了解到这是一份关于bst-4wd+V4.0发行版1的文档,主要关注的是与stm32微控制器相关的硬件设计细节。由于提供的文档内容较为复杂且部分信息不易解读,以下将重点围绕标题、描述以及部分可见...

    4位数码管计时器_4位数码管时钟_BST-M51计时器_

    在这个项目中,数码管被连接到BST-M51微控制器,这是一款基于MCU的集成芯片,能够处理计时器的逻辑和显示控制。 BST-M51计时器是基于BST(BestSemiconductor Technology)公司的一款微控制器,该控制器具有高性能、...

    BST-V51智能小车底板原理图1

    ### BST-V51智能小车底板电路原理图 #### 一、整体概述 BST-V51智能小车是一款集成了多种传感器与执行器的智能设备,主要用于教育及科研领域。其底板电路原理图展示了该智能小车的核心硬件设计,包括舵机供电模块、...

    亚博智能BST-M51学习板常用函数集.zip

    亚博智能BST-M51学习板是一款用于教育和实验目的的微控制器开发平台,它基于STC公司的M51系列单片机。这个压缩包包含了几个关键的源代码文件,帮助用户快速理解和应用BST-M51学习板上的功能。下面我们将详细探讨这些...

    亚博智能科技BST-V51学习板全套资料

    视频,源代码,光盘配套一切资料

    bst-bmi270-sf000 数据手册1

    bst-bmi270-sf000 数据手册1 本资源手册对应的是Bosch Sensortec的BMI270uttle板3.0的数据手册,主要介绍了该板的概况、电气布局、引脚定义等信息。 知识点1:BMI270 Shuttle Board 3.0概况 * BMI270 Shuttle ...

    严蔚敏-数据结构_C语言

    - 二叉查找树(Binary Search Tree,BST):对于任意一个节点,其左子树中的所有节点的值均小于它的值,而右子树中的所有节点的值均大于它的值。 - 平衡二叉搜索树(Balanced Binary Search Tree):在二叉查找树...

    从BST到SBT

    ### 从BST到SBT:深入理解二叉搜索树及自平衡二叉搜索树 #### 1. 引言 在计算机科学领域中,数据结构的设计对于提高算法效率至关重要。其中,二叉搜索树(Binary Search Tree, BST)作为一种基本且高效的数据结构,...

    BST.rar_c++ tree node_read-bst-1

    `BST.rar_c++ tree node_read-bst-1`这个文件名可能是指包含了C++实现二叉搜索树节点读取的代码,具体实现可能涉及对二进制文件的读取和解析,以便于存储和恢复树的状态。 6. **应用**: 二叉搜索树广泛应用于...

    数据结构算法与应用-C__语言描述

    在C语言中,树结构如二叉搜索树(BST)可以用来快速查找、插入和删除数据。AVL树是一种自平衡的二叉搜索树,确保任何节点的两个子树高度差不超过1,从而保证了搜索效率。红黑树则是一种弱平衡的二叉查找树,其特性是...

    BST-BMP280-DS001-12.pdf

    《BMP280数字压力传感器数据手册》是Bosch Sensortec公司发布的一份技术参考资料,文档编号BST-BMP280-DS001-12,修订版本为1.15,发布日期为2015年10月15日。该手册详细介绍了BMP280这款数字压力传感器的关键参数和...

    BST-BMP280-DS001-11.zip_BMP280_BMP280 data sheet_This Is It

    **BST-BMP280-DS001-11.zip** 包含的是BOSCH Sensortec公司的BMP280传感器的数据手册。**BMP280** 是一款高度集成的数字压力和温度传感器,广泛应用于气象、环境监测、物联网设备以及消费电子产品中。这份数据手册是...

    8-07-14_MegaCLI for linux_windows

    包含如下操作系统版本 FreeBSD Linux Solaris Windows 分别对应如下目录 MegaCLI for DOS MegaCLI for Linux MegaCLI for Solaris MegaCLI for FreeBSD MegaCLI for Windows ********************************...

    bst-bmi088-ds001.pdf

    BMI088是一款六轴运动追踪的惯性测量单元(IMU),能够检测六个自由度(6DoF)内的移动和旋转。它集成了两个惯性传感器的功能于一个设备中:一个先进的三轴16位陀螺仪和一个多功能的、领先的三轴16位加速度计。...

Global site tag (gtag.js) - Google Analytics