Size Balance Tree(SBT模板整理)】的更多相关文章

不想用treap和Splay,那就用SB树把,哈哈,其实它一点也SB,厉害着呢. 先膜拜一下作者陈启峰.Orz 以下内容由我搜集整理得来. 一.BST及其局限性 二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 1.若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 2.任意节点的右子树不空,则右子树上所有结点的值均大于它的根结…
/* * tree[x].left 表示以 x 为节点的左儿子 * tree[x].right 表示以 x 为节点的右儿子 * tree[x].size 表示以 x 为根的节点的个数(大小) */ struct SBT { int key,left,right,size; } tree[10010]; int root = 0,top = 0; void left_rot(int &x) // 左旋 { int y = tree[x].right; if (!y) return; tree[x]…
SBT(Size Balance Tree), 即一种通过子树大小(size)保持平衡的BST SBT的基本性质是:每个节点的size大小必须大于等于其兄弟的儿子的size大小: 当我们插入或者删除一个节点之后,SBT的性质会有所改变,此时需要函数maintain(mt)来维持平衡 mt(T)用于修复以T为根的子树的SBT 调用mt(T)的前提是T的子树都已经是SBT了 {由于左右对称,这里只讨论关于上图第一个不等式不成立的例子} 情形1:size[A] > size[R] 此时只需继续mt(A…
Size Balanced Tree(SBT)是目前速度最快的平衡二叉搜索树,且能够进行多种搜索操作,区间操作:和AVL.红黑树.伸展树.Treap类似,SBT也是通过对节点的旋转来维持树的平衡,而相比其他平衡树,SBT维持平衡所需要的额外数据很少,只需要维持以当前节点为根的子树的大小:且SBT的编写复杂度低.因此具有空间优势.速度优势.编写优势. SBT的节点 SBT节点维持很少的额外信息,只需要知道以当前节点为根的子树的大小. struct TreeNode{ int data; TreeN…
首先是从二叉搜索树开始,一棵二叉搜索树的定义是: 1.这是一棵二叉树: 2.令x为二叉树中某个结点上表示的值,那么其左子树上所有结点的值都要不大于x,其右子树上所有结点的值都要不小于x. 由二叉搜索树的第二条定义,可以很方便地利用这种特点在二叉树中以O(logn)的渐进复杂度完成插入.查找.删除等操作. 但是这里还是有个问题,就是弄不好的话,一棵普通的二叉搜索树经过多次修改操作之后可能会导致整棵树左右“不平衡”,出现一边结点很多,另一边结点很少的情况,这样最终每一次的操作时间就会大大偏离O(lo…
史诗级ACM模板整理 基本语法 字符串函数 istream& getline (char* s, streamsize n ); istream& getline (char* s, streamsize n, char delim ); istream& getline (istream& is, string& str, char delim); istream& getline (istream& is, string& str); c…
引言 - 初识 Size Balanced Tree 最近在抽细碎的时间看和学习 random 的 randnet 小型网络库. iamrandom/randnet - https://github.com/iamrandom/randnet (1) 了解到 陈启峰 2006-12-29 高中的时候写的论文 Size Balanced Tree(一种变种的 AVI 树) 感觉好精彩. 就着手翻译成实战代码. 陈启峰 Size Balanced Tree - https://files.cnblo…
KMP模板整理 KMP与扩展KMP: /*vs 2017/ vs code以外编译器,去掉windows.h头文件和system("pause");*/ #include<iostream> #include<cstdio> #include<cstring> #include<Windows.h> #include<cmath> #include<algorithm> using namespace std; ;…
基础知识(包括但不限于:二叉查找树是啥,SBT又是啥反正又不能吃,平衡树怎么旋转,等等)在这里就不(lan)予(de)赘(duo)述(xie)了. 先贴代码(数组模拟): int seed; int _rand() { +; } template <class T> struct SbtNode { T val; int lSize; int rSize; int lch; int rch; void assignVir() { lSize=rSize=lch=rch=; } void ass…
模板: 以下为弹飞绵羊代码: #define Troy #include "bits/stdc++.h" using namespace std; ; inline int read(){ ,k=;char ch=getchar(); :,ch=getchar(); &ch<=+(ch^),ch=getchar(); return s*k; } #define size(t) (t?t->size:0) #define rev(t) (t?t->rev^=1:…
CSP2019前夕整理一下模板,顺便供之后使用 0. 非算法内容 0.1. 读入优化 描述: 使用getchar()实现的读入优化. 代码: inline int read() { int x=0; bool f=1; char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=0; for(; isdigit(c);c=getchar()) x=x*10+(c^'0'); if(f) return x; return -x; } 0…
定义 SBT也是一种自平衡二叉查找树,它的平衡原理是每棵树的大小不小于其兄弟树的子树的大小 即size(x->l)$\ge$size(x->r->l),size(x->r->r),右边同理size(x->r)$\ge$size(x->l->l),size(x->l->r) 具体操作 旋转 旋转几乎是所有平衡树所共有的操作,操作方法也基本相同 void rotate(SBT *&x,int d){//旋转操作,d=0表示左旋,d=1表示右旋…
先占个坑 [update]noip结束了,弃了 一.图论 1.单源最短路 洛谷P3371 (1)spfa 已加SLF优化 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; ,M=5e5+,INF=; inline int read(){ ,f=; ;c=getchar();} +c-';c=getchar();}…
目录 计算几何✔ DP 斜率优化✔ 四边形不等式✔ 轮廓线DP✘ 各种分治 CDQ分治✔ 点分治✔ 整体二分✔ 数据结构 线段树合并✔ 分块✔ K-D Tree LCT 可持久化Trie✔ Splay fhq Treap 虚树 可并堆 左偏树* 数学,数论 CRT 扩展CRT Lucas 扩展Lucas 杜教筛✔ Min25筛 莫比乌斯反演✔ FFT,NTT FWT BSGS Miller Rabin* Pollard Rho* Catalan数 Stirling数 高斯消元 拉格朗日插值✔ 单…
目录 前言 练习1 BZOJ 3224 普通平衡树 练习2 BZOJ 3223 文艺平衡树 练习3 BZOJ 1588 [HNOI2002]营业额统计 练习4 BZOJ 1208 [HNOI2004]宠物收养场 练习5 BZOJ 1507 [NOI2003]文本编辑器 editor 练习6 BZOJ 1503 [NOI2004]郁闷的出纳员 前言 学习于yyb 本来是想写个算法解释,克自己写了一半总感觉像复制的,各位就去yyb哪里学吧 这里附上几个BZOJ的模板题 \n \n \n \n 练习1…
省选前把板子整理一遍,如果发现有脑抽写错的情况,欢迎各位神犇打脸 :) 数学知识 数论: //组合数 //C(n,m) 在n个数中选m个的方案数 ll C[N][N]; void get_C(int n) { for(int i=1;i<=n;i++) { C[i][i]=C[i][0]=1; for(int j=1;j<i;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod; } } //欧几里得算法 //(a,b) ll gcd(ll a,ll b) { re…
前言: 之前做题二分都是手动二分造轮子,用起来总是差强人意,后来看到STL才发现前辈们早就把轮子造好了,不得不说比自己手动实现好多了. 常用操作 1.头文件 #include <algorithm> 2.使用方法 1.binary_search:查找某个元素是否出现.a.函数模板:binary_search(arr[],arr[]+size ,  indx)b.参数说明:    arr[]: 数组首地址    size:数组元素个数    indx:需要查找的值c.函数功能:  在数组中以二分…
概念: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列.如果这组数有n个,那么全排列数为n!个. 比如a,b,c的全排列一共有3!= 6 种 分别是{a, b, c}.{a, c, b}.{b, a, c}.{b, c, a}.{c, a, b}.{c, b, a}. 使用方法 这里先说两个概念:“下一个排列组合”和“上一个排列组合”,对序列 {a, b, c},每一个元素都比后面的小,按照字典序列,固…
开学两天,身上的职责直接变为两个班班长,三个小组组长,哇这事情估计够我忙活了,想躲都躲不掉啊,看来我还是真招人推荐各种管理职务啊,以后要是有人推荐我当经理啊领导啊该多好哈哈哈哈.记得今天奶奶生日,很开心地给奶奶打了一通电话,这怕是我第一次给奶奶电话送生日祝福了哈哈哈,是啊,很想珍惜身边的人,但很多时候却一心想提高自己地能力而忽视了身边人,就这四年,就这四年好好提升自己,毕业出来一定要好好陪陪家里祖辈亲戚们. 今天有点特殊,我整理了一下学到这么久编程以来的一些模板和技巧,虽然还没整理完,就作为(一…
一.什么是标准模板库(STL)? 1.C++标准模板库与C++标准库的关系 C++标准模板库其实属于C++标准库的一部分,C++标准模板库主要是定义了标准模板的定义与声明,而这些模板主要都是 类模板,我们可以调用这些模板来定义一个具体的类:与之前的自己手动创建一个函数模版或者是类模板不一样,我们使用了 STL就不用自己来创建模板了,这些模板都定义在标准模板库中,我们只需要学会怎么使用这些类模板来定义一个具体的类, 然后能够使用类提供的各种方法来处理数据. 2.STL六大组件:容器(contain…
线段树单点修改区间查询 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 ; struct segmentTree{ int sum; }tree[maxn<<]; int per[maxn]; void PushUp(in…
; ; ; ; ){ ; &&k<T[r].key)||(T[r].right==&&k>T[r].key)){ );      }               Delete(T[r].left,delay,min_val);          T[r].size=T[T[r].right].size+T[T[r].left].size+;      }  }                 r=T[r].right;       }              …
学习来源:计蒜客 平衡树 1.定义 对于每一个结点.左右两个子树的高度差的绝对值不超过1,或者叫深度差不超过1 为什么会出现这样一种树呢? 假如我们依照1-n的顺序插入到二叉排序树中,那么二叉排序树就退化成了一个有序链表,效率大大减少. 2.有关概念 全部平衡树基本由下面三个特征组成: 1.自平衡条件 2.旋转操作 3.旋转的触发 平衡树通过设置合理的自平衡条件,使得二叉排序树的查找.插入等操作的性能不至于退化到 O(n)O(n),而且在进行二叉排序树的查找.插入等操作时进行推断.假设满足当中某…
去除过水的模板,包括但不限于dijkstra(甚至堆优化都被过滤了).SPFA.kruskal.拓扑排序等. 欧拉回路:http://uoj.ac/problem/117 #include<bits/stdc++.h> using namespace std; ; ,in[N],ou[N],vis[N],hd[N],v[N],nxt[N],ans[N]; void adde(int x,int y){v[++ecnt]=y,nxt[ecnt]=hd[x],hd[x]=ecnt;} void d…
priority_queue 优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序,每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储. 定义: priority_queue<int> p;//最大值优先,是大顶堆一种简写方式 priority_queue<int,vector<int>,greater<int>>q1;//最小值优先,小顶堆 priority_queue<int,v…
pair pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同.如果一个函数有两个返回值的话,如果是相同类型,就可以用数组返回,如果是不同类型,就可以自己写个struct ,但为了方便就可以使用 c++自带的pair ,返回一个pair,其中带有两个值.除了返回值的应用,在一个对象有多个属性的时候 ,一般自己写一个struct ,如果就是两个属性的话,就可以用pair 进行操作.pair 可以省的自己写一个struct .如果有三个属性的话,其实也是可以用的pair 的 ,极端的写…
SET set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序.应该注意的是set中数元素的值不能直接被改变. set常用操作: 1. begin()--返回指向第一个元素的迭代器 2. clear()--清除所有元素 3. count()--返回某个值元素的个数 4. empty()--如果集合为空,返回true 5. end()--返回指向最后一个元素的迭代器 6. equal_range()--…
map容器: 继上一篇 ,Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道.map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的.至于二叉树这种数据结构,本人暂时没有任何了解.在map这个容器中,提供一种“键- 值”关系的一对一的数据存储能力.其“键…
如今安卓比較流行的布局就是类似新闻client和手机QQ那种的底端可选择,上面的个别页面能够滑动选择. 在測试过程中发现用安卓自带的TabHost去构建.非常难得到自己定义的效果. 因此採用TabHost+ViewPager+RadioGroup去构建这个效果 首先要弄清楚各自的用途和功能 (1)TabHost 因为安卓自带的TabHost貌似在有些手机版本号上仅仅能固定在底端的位置,所以我们用GadioGroup去显示界面button,因为构建HabHost必须定义host.tabs.cont…
#include<cstdio> #include<algorithm> #define N 50010 #define M 500010 #define rg register #define LL long long using namespace std; int n,m,cnt,root,tot,totnow,totbf; int last[N],size[N],mxsize[N],dep[N],tmp[N],mg[N]; LL ans=; bool v[N]; struc…