SBT 模板不完全总结,后续待填
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 模板不完全总结,后续待填的更多相关文章
- Size Balance Tree(SBT模板整理)
/* * tree[x].left 表示以 x 为节点的左儿子 * tree[x].right 表示以 x 为节点的右儿子 * tree[x].size 表示以 x 为根的节点的个数(大小) */ s ...
- 《Ext JS模板与组件基本知识框架图----模板》
最近在整理Ext JS的模板和组件,在参考<Ext JS权威指南>,<Ext JS Web应用程序开发指南>,<Ext JS API>等相关书籍后才写下这篇< ...
- django 模板语法和三种返回方式
模板 for循环 {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} if语句 ...
- HDU 4557 非诚勿扰 队列、(记一次失败的SBT尝试)
非诚勿扰 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) [Problem De ...
- .NET之微信消息模板推送
最近在项目中使用到了微信消息模板推送的功能,也就是将对应的消息推送到对应的用户微信上去,前提是你必须要有一个微信公众号并且是付费了的才会有这个功能,还有就是要推送的用户必须是的关注了你的微信公众号的. ...
- IDEA中设置注释模板的方法
IDEA中设置注释模板主要分为两个部分,分别是创建java文件时类的注释和方法的注释. 这里为大家详细介绍一下方法,按MyEclipse的风格设置(MyEclipse的请看:MyEclipse中设置注 ...
- 超详细设置Idea类注释模板和方法注释模板
网上找了一下,没有很详细且正确介绍Idea配置注释模板的,于是结合多篇文章自己琢磨整理出如下. 设置类注释模板 1.选择File–>Settings–>Editor–>File an ...
- python 全栈开发,Day119(Flask初识,Render Redirect HttpResponse,request,模板语言 Jinja2,用户登录例子,内置Session)
一.Flask初识 首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 三大主流Web框架对比 ...
- IntelliJ IDEA for MAC 注释模板、快捷键生成注释
增加注释 在IntelliJ IDEA中为JAVA代码增加注释,首先需要配置注释模板,而后使用模板快捷键生成注释, 下面按照[配置模板].[模板使用]两部分进行介绍 ----------------- ...
随机推荐
- 32位Oracle10g在64位CentOS下安装失败记录
环境信息:Alibaba Cloud Elastic Compute Service,CentOS Linux release 7.4.1708 (Core),16C/64GB. 使用32位Oracl ...
- IOS - PDF合并 - 转
来自:http://www.cnblogs.com/tx8899/p/4082749.html #pragma mark - Merge PDF - (void)mergePDF { NSArray ...
- 转-MAC 下安装PHONEGAP开发环境
来自:http://jinzhe.net/post/8.html 什么是Phonegap呢?Phonegap是一个利用HTML5去开发App的框架.可以为安卓.iOS.WP.黑莓.火狐等移动操作系统. ...
- 转 PHP编程过程中需要了解的this,self,parent的区别
{一}PHP中this,self,parent的区别之一this篇 面向对象编程(OOP,Object Oriented Programming)现已经成为编程人员的一项基本技能.利用OOP的思想进行 ...
- AngularJS开发最常犯的10个错误
简介 AngularJS是目前最为活跃的Javascript框架之一,AngularJS的目标之一是简化开发过程,这使得AngularJS非常善于构建小型app原型,但AngularJS对于全功能的客 ...
- [转]windows azure How to use Blob storage from .NET
本文转自:http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-blobs/?rnd=1 ...
- web+ admin template,spa管理应用后台,easyui后台正式发布
演示地址:http://admintemplate.webplus.org.cn/ v1.0 (2016/7/27) 扁平化风格 全屏支持 后台管理不使用iframe,全ajax开发 权限管理 商品管 ...
- LitePal用法详解
一.首先我对数据库的操作基于LitePal的,是基于面向对象思想的,所以首先我先讲怎么使用LitePal 1.在build.garde(Module:app)里面的 dependencies{ //添 ...
- 了解移动用户的隐私期望:一种基于推荐的Crowdsourcing方法
应学习之需,最近一段时间阅读了一篇论文,特写下总结,若有纰漏,还望指出. 目录 引言 推荐机制 实现 评估 心得 1.1 为什么要了解移动用户的隐私期望 1.移动设备的广泛使用存在一些潜在的隐私威胁和 ...
- Matlab中size、numel、length、fix函数的使用
size():获取矩阵的行数和列数 (1)s=size(A), 当只有一个输出参数时,返回一个行向量,该行向量的第一个元素时矩阵的行数,第二个元素是矩阵的列数. (2)[r,c]=size ...