1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<algorithm>
  5 #define N 100005
  6 using namespace std;
  7 struct SBT{
  8     //左子树指针,右子树指针,大小,键值
  9     int left,right,size,key;
 10     void Init(){
 11         left=right=key=;
 12         size=;
 13     }
 14 }T[N];
 15 int root,tot; //根的位置以及节点个数
 16 //左旋转处理
 17 void Left_rot(int &x){  
 18     int k=T[x].right;
 19     T[x].right=T[k].left;
 20     T[k].left=x;
 21     T[k].size=T[x].size;
 22     T[x].size=T[T[x].left].size+T[T[x].right].size+;
 23     x=k;
 24 }
 25 //右旋转处理
 26 void Right_rot(int &x){
 27     int k=T[x].left;
 28     T[x].left=T[k].right;
 29     T[k].right=x;
 30     T[k].size=T[x].size;
 31     T[x].size=T[T[x].left].size+T[T[x].right].size+;
 32     x=k;
 33 }
 34 //调整处理
 35 void Maintain(int &r,bool flag){
 36     if(flag){  //更新右子树
 37         if(T[T[T[r].right].right].size>T[T[r].left].size)
 38             Left_rot(r);
 39         else if(T[T[T[r].right].left].size>T[T[r].left].size){
 40             Right_rot(T[r].right);
 41             Left_rot(r);
 42         }
 43         else
 44             return;
 45     } 
 46     else{   //更新在左子树
 47         if(T[T[T[r].left].left].size>T[T[r].right].size)
 48             Right_rot(r);
 49         else if(T[T[T[r].left].right].size>T[T[r].right].size){
 50             Left_rot(T[r].left);
 51             Right_rot(r);
 52         }
 53         else 
 54             return;
 55     }
 56     //更新子树,然后再更新根,直到平衡为止
 57     Maintain(T[r].left,false);
 58     Maintain(T[r].right,true);
 59     Maintain(r,false);
 60     Maintain(r,true);
 61 }
 62 //插入新节点
 63 void Insert(int &r,int k){
 64     if(r==){
 65         r=++tot;
 66         T[r].Init();
 67         T[r].key=k;
 68     }
 69     else{
 70         T[r].size++;
 71         if(k<T[r].key)
 72             Insert(T[r].left,k);
 73         else
 74             Insert(T[r].right,k);
 75         //插入后要调整,保证平衡
 76         Maintain(r,k>=T[r].key);
 77     }
 78 }
 79 //删除结点,利用的是前驱替换
 80 int Remove(int &r,int k){
 81     int d_key;
 82     if(!r)
 83         return ;
 84     T[r].size--;
 85     //前者说明就是要删的节点,后两者说明不存在此节点
 86     if(T[r].key==k||(T[r].left==&&k<T[r].key)||(T[r].right==&&k>T[r].key)){
 87         d_key=T[r].key;
 88         if(T[r].left&&T[r].right)
 89             T[r].key=Remove(T[r].left,k+);
 90         else
 91             r=T[r].left+T[r].right;
 92     }
 93     else Remove(k<T[r].key?T[r].left:T[r].right,k);
 94 }
 95 void Delete(int &r,int delay,int min_val){
 96     if(!r) return;
 97     if(T[r].key+delay<min_val) {
 98         r=T[r].right;
 99         Delete(r,delay,min_val);
     }
     else{
         Delete(T[r].left,delay,min_val);
         T[r].size=T[T[r].right].size+T[T[r].left].size+;
     }
 }
 //取得最大值,即一直遍历到最右的结点
 int Get_Max(int &r){
     while(T[r].right)
         r=T[r].right;
     return r;
 }
 //取得最小值,即一直遍历到最左的结点
 int Get_Min(int &r){
     while(T[r].left)
         r=T[r].left;
     return r;
 }
 //获得前驱
 int Get_Pre(int &r,int y,int k){
     if(r==) return y;
     if(k>T[r].key)
         Get_Pre(T[r].right,r,k);
     else
         Get_Pre(T[r].left,y,k);
 }
 //获得后继
 int Get_Next(int &r,int y,int k){
     if(r==) return y;
     if(k<T[r].key)
         Get_Next(T[r].left,r,k);
     else
         Get_Next(T[r].right,y,k);
 }
 //取得第K小的数,注:暂不能解决有重复数的
 int Get_Min_Kth(int &r,int k){
     int t=T[T[r].left].size+;
     if(t==k) return T[r].key;
     if(t<k)  return Get_Min_Kth(T[r].right,k-r);
     else return Get_Min_Kth(T[r].left,k);
 }
 //取得第K大的数
 int Get_Max_Kth(int &r,int k){
     int t=T[T[r].right].size+;
     if(t==k) return T[r].key;
     if(t<k) return Get_Max_Kth(T[r].left,k-t);
     else return Get_Max_Kth(T[r].right,k);
 }
 //获得结点的名次
 int Get_Rank(int &r,int k){
     if(k<T[r].key) 
         return Get_Rank(T[r].left,k);
     else if(k>T[r].key)
         return Get_Rank(T[r].right,k)+T[T[r].left].size+;
     else
         return T[T[r].left].size+;
 }
 //排序
 void Inorder(int &r){
     if(r==) return;
     Inorder(T[r].left);
     printf("%d\n",T[r].key);
     Inorder(T[r].right);
 }

SBT 模板不完全总结,后续待填的更多相关文章

  1. Size Balance Tree(SBT模板整理)

    /* * tree[x].left 表示以 x 为节点的左儿子 * tree[x].right 表示以 x 为节点的右儿子 * tree[x].size 表示以 x 为根的节点的个数(大小) */ s ...

  2. 《Ext JS模板与组件基本知识框架图----模板》

    最近在整理Ext JS的模板和组件,在参考<Ext JS权威指南>,<Ext JS Web应用程序开发指南>,<Ext JS API>等相关书籍后才写下这篇< ...

  3. django 模板语法和三种返回方式

    模板 for循环 {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} if语句 ...

  4. HDU 4557 非诚勿扰 队列、(记一次失败的SBT尝试)

    非诚勿扰 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) [Problem De ...

  5. .NET之微信消息模板推送

    最近在项目中使用到了微信消息模板推送的功能,也就是将对应的消息推送到对应的用户微信上去,前提是你必须要有一个微信公众号并且是付费了的才会有这个功能,还有就是要推送的用户必须是的关注了你的微信公众号的. ...

  6. IDEA中设置注释模板的方法

    IDEA中设置注释模板主要分为两个部分,分别是创建java文件时类的注释和方法的注释. 这里为大家详细介绍一下方法,按MyEclipse的风格设置(MyEclipse的请看:MyEclipse中设置注 ...

  7. 超详细设置Idea类注释模板和方法注释模板

    网上找了一下,没有很详细且正确介绍Idea配置注释模板的,于是结合多篇文章自己琢磨整理出如下. 设置类注释模板 1.选择File–>Settings–>Editor–>File an ...

  8. python 全栈开发,Day119(Flask初识,Render Redirect HttpResponse,request,模板语言 Jinja2,用户登录例子,内置Session)

    一.Flask初识 首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 三大主流Web框架对比 ...

  9. IntelliJ IDEA for MAC 注释模板、快捷键生成注释

    增加注释 在IntelliJ IDEA中为JAVA代码增加注释,首先需要配置注释模板,而后使用模板快捷键生成注释, 下面按照[配置模板].[模板使用]两部分进行介绍 ----------------- ...

随机推荐

  1. strings命令的实现 2014-06-02 00:17 355人阅读 评论(0) 收藏

    本程序实现从文件中提取连续4个以上的可打印字符.模仿linux中string命令 #include <stdio.h> #include<stdlib.h> #include ...

  2. Java Annontation(注解)详解

    java中经常用到注解(Annontation),索性整理了下关于注解的相关知识点: 一.概念 Annontation是Java5开始引入的新特征,类似与.NET 中的attribute.中文名称一般 ...

  3. jmeter(十五)Jmeter默认报告优化

    一.本文目的: 之前写了两篇文章搭建持续集成接口测试平台(Jenkins+Ant+Jmeter)和ANT批量执行Jmeter脚本,功能实现上都没有什么问题,但是最后生成的报告有一点小问题,虽然不影响使 ...

  4. Hadoop集群搭建及MapReduce应用

    一.Hadoop集群的搭建与配置 1.节点准备 集群规划: 主机名 IP 安装的软件 运行的进程 weekend 01 192.168.1.60 jdk.hadoop NameNode.DFSZKFa ...

  5. 块级元素的text-align对行内元素和果冻元素(inline-block)的作用

    块级元素社设置了text-align:center以后,对其直接行内元素/果冻元素.继承行内元素/果冻元素都会产生“居中效应”. <style> .test4{ text-align: c ...

  6. scala打印error,debug,info

    1.以wordcount为例 package org.apache.spark.examples import org.apache.spark.examples.SparkPi.logger imp ...

  7. SQL——时间戳

    mysql 低版本,date.datetime.timestamp 无法精确到毫秒 可以舍弃时间类型字段,用 bigint 来代替,如果用字符串类型代替,还是比较担心排序的时候只是根据第一个字母进行排 ...

  8. Webpack 入门(一):安装 / 打包 / 命令行

    一:安装webpack和基本环境搭建 新建一个工作的文件夹(我取的名字叫Webpack) 打开命令行,cd进入该文件夹 //初始化一下npm > E:\work\Webpack>npm i ...

  9. QT5:先导篇 正则表达式

    一.简介 使用正则表达式可以快速完成处理字符串的一些操作,如验证 查找 替换和分割 Qt的QRegExp类是正则表达式的表示类,它基于Perl的正则表达式语言 正则表达式由表达式(expression ...

  10. HDU - 4544 湫湫系列故事——消灭兔子(优先队列+贪心)

    题目: 最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏. 游戏规则很简单,用箭杀死免子即可. 箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别 ...