模板 SBT
傻逼树模板
struct SBT{
const static int maxn = 1e5 + 15;
int lft[maxn] , rht[maxn] , key[maxn] , s[maxn] , tot , root ;
void init(){ tot = root = 0 ; }
void init( int x , int val = 0 ){
lft[x] = rht[x] = 0 , key[x] = val , s[x] = 1;
}
inline void up(int x){
s[x] = s[lft[x]] + s[rht[x]] + 1;
}
void lr(int &t){
int k = rht[t];
rht[t] = lft[k];
lft[k] = t;
s[k] = s[t];
up(t);
t = k;
}
void rr(int &t){
int k = lft[t];
lft[t] = rht[k];
rht[k]= t;
s[k] = s[t];
up(t);
t = k;
}
void Maintain(int &t,bool dir){
if(dir == false){
if(s[lft[lft[t]]] > s[rht[t]])
rr(t);
else if(s[rht[lft[t]]] > s[rht[t]]){
lr(lft[t]);
rr(t);
}
else return;
}
else{
if(s[rht[rht[t]]] > s[lft[t]]) lr(t);
else if(s[lft[rht[t]]] > s[lft[t]]){
rr(rht[t]);
lr(t);
}
else return;
}
Maintain(lft[t],false);
Maintain(rht[t],true);
Maintain(t,true);
Maintain(t,false);
}
void Insert( int & t , int val ){
if( t == 0 ){
t = ++ tot;
init( t , val );
}else{
++ s[t];
if( val < key[t] ) Insert( lft[t] , val );
else Insert( rht[t] , val );
Maintain( t , val >= key[t] );
}
}
// 删除操作必须保证元素存在
int Delete(int &t , int v){
int ret = 0;
s[t] --;
if((v == key[t]) || (v<key[t] && lft[t] == 0) ||(v > key[t] && rht[t] == 0) ){
ret = key[t];
if(lft[t] == 0 || rht[t] == 0) t = lft[t] + rht[t];
else key[t] = Delete(lft[t],key[t] + 1);
}
else{
if(v < key[t]) ret = Delete(lft[t] , v);
else ret = Delete(rht[t] , v);
}
return ret;
}
bool find( int t , int val ){
if( t == 0 ) return false;
else if( key[t] == val ) return true;
else if( val < key[t] ) return find( lft[t] , val );
else return find( rht[t] , val );
}
void preorder( int x ){
if( lft[x] ) preorder( lft[x] );
printf("%d " , key[x]);
if( rht[x] ) preorder( rht[x] );
}
int size(){
return s[root];
}
// 查第 k 小 , 必须保证合法
int kth( int x , int k ){
if( k == s[lft[x]] + 1 ) return key[x];
else if( k <= s[lft[x]] ) return kth( lft[x] , k );
else return kth( rht[x] , k - s[lft[x]] - 1 );
}
//找前驱
int pred( int t , int v ){
if( t == 0 ) return v;
else{
if( v <= key[t] ) return pred( lft[t] , v );
else{
int ans = pred( rht[t] , v );
if( ans == v ) ans = key[t];
return ans;
}
}
}
// 严格小于 v 的有多少个
int less( int t , int v ){
if( t == 0 ) return 0;
if( v <= key[t] ) return less( lft[t] , v );
else return s[lft[t]] + 1 + less( rht[t] , v );
}
//找后继
int succ( int t , int v ){
if( t == 0 ) return v;
else{
if( v >= key[t] ) return succ( rht[t] , v );
else{
int ans = succ( lft[t] , v );
if( ans == v ) ans = key[t];
return ans;
}
}
}
}sbt;
模板 SBT的更多相关文章
- 三大平衡树(Treap + Splay + SBT)总结+模板[转]
Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板: #include <cstdio> #include <cstring> #i ...
- 子树大小平衡树(Size Balanced Tree,SBT)操作模板及杂谈
基础知识(包括但不限于:二叉查找树是啥,SBT又是啥反正又不能吃,平衡树怎么旋转,等等)在这里就不(lan)予(de)赘(duo)述(xie)了. 先贴代码(数组模拟): int seed; int ...
- Size Balanced Tree(SBT) 模板
首先是从二叉搜索树开始,一棵二叉搜索树的定义是: 1.这是一棵二叉树: 2.令x为二叉树中某个结点上表示的值,那么其左子树上所有结点的值都要不大于x,其右子树上所有结点的值都要不小于x. 由二叉搜索树 ...
- HDU 4006 The kth great number 优先队列、平衡树模板题(SBT)
The kth great number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Oth ...
- 平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】
平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是 ...
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...
- [luogu P3369]【模板】普通平衡树(Treap/SBT)
[luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...
- 三大平衡树(Treap + Splay + SBT)总结+模板[转]
Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板: #include <cstdio> #include <cstring> #i ...
- 三大平衡树(Treap + Splay + SBT)总结+模板
Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板: #include <cstdio> #include <cstring> #i ...
随机推荐
- Dom解析XML文件具体用法
public class Dom4j { public static void main(String[] args) throws Exception { List<Student> l ...
- docker stack 部署 mysql 5.6
=============================================== 2018/7/1_第1次修改 ccb_warlock === ...
- 从bind函数看js中的柯里化
以下是百度百科对柯里化函数的解释:柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.概念太抽象,可能 ...
- 深度解析eclipse控制台
第一个按钮:scroll lock 控制台在打印sql语句的时候会一直滚动,用这个按钮可以固定住控制台不乱跑; 第二个按钮:show console when standard out changes ...
- C++类指针类型的成员变量的浅复制与深复制
本篇文章旨在阐述C++类的构造,拷贝构造,析构机制,以及指针成员变量指针悬空问题的解决.需要读者有较好的C++基础,熟悉引用,const的相关知识. 引言: 类作为C++语言的一种数据类型,是对C语言 ...
- 洛谷P2312解方程
传送门 思路分析 怎么求解呢? 其实我们可以把左边的式子当成一个算式来计算,从1到 $ m $ 枚举,只要结果是0,那么当前枚举到的值就是这个等式的解了.可以通过编写一个 $ bool $ 函数来判断 ...
- Chrome+XX_Net的上网渠道
本页面将详细演示如何在一台全新的Windows7电脑上架设起Chrome+XX_Net的上网渠道. 本文包含以下部分: 下载和安装Chrome浏览器 获取和运行XX-Net 设置代理 手动导入证书(备 ...
- Excel根据单元格内容设置整行颜色
1. 选择需要设置的区域,条件格式中找到“新建规则” 2. 弹出窗口中选择“使用公式确定要设置格式的单元格”一项.填写公式如下: =IF(OR($D1="已完成",$D1=&quo ...
- Asp.net Vnext TagHelpers
概述 本文已经同步到<Asp.net Vnext 系列教程 >中] TagHelpers 是vnext中引入的新功能之一.TagHelper 的作用是类似于发挥在以前版本的 ASP.NET ...
- HDU - 4458 计算几何判断点是否在多边形内
思路:将飞机看成不动的,然后枚举时间看点是否在多边形内部. #include<bits/stdc++.h> #define LL long long #define fi first #d ...