子树大小平衡树(SizeBalancedTree,SBT)——模板
植树节,种一棵SBT玩玩,跑得不是很快…………不过还好吧…………
求各路神牛轻虐…………………
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 const int INF=0x7fffffff; 8 const int MAXN=1000010; 9 10 struct _Node 11 { 12 int key,size; 13 _Node *s[2]; 14 _Node() {} 15 _Node(int key,int size,_Node *v):key(key),size(size) {s[0]=s[1]=v;} 16 }pool[MAXN],null(0,0,&null); 17 18 int idx; 19 20 class SizeBalancedTree 21 { 22 private: 23 24 _Node *root; 25 26 void _update(_Node* now) 27 { 28 now->size=now->s[0]->size+now->s[1]->size+1; 29 } 30 void _rot(_Node *&now,bool d) 31 { 32 _Node *s=now->s[d]; 33 now->s[d]=s->s[!d]; 34 s->s[!d]=now; 35 _update(now),_update(s); 36 now=s; 37 } 38 void _maintain(_Node *&now,bool d) 39 { 40 if (now==&null) return; 41 _Node *&p=now->s[d]; 42 43 if (p->s[d]->size>now->s[!d]->size) 44 _rot(now,d); 45 else if (p->s[!d]->size>now->s[!d]->size) 46 { 47 _rot(p,!d); 48 _rot(now,d); 49 } 50 else return; 51 _maintain(now->s[0],0); 52 _maintain(now->s[1],1); 53 _maintain(now,0); 54 _maintain(now,1); 55 } 56 void _ins(_Node *&now,int key) 57 { 58 if (now==&null) 59 { 60 now=pool+(idx++); 61 *now=_Node(key,1,&null); 62 return; 63 } 64 bool d=key>now->key; 65 _ins(now->s[d],key); 66 _maintain(now,d); 67 _update(now); 68 } 69 bool _del(_Node *&now,int key) 70 { 71 if (now==&null) return false; 72 bool d,succ; 73 if (now->key==key) 74 { 75 if (now->s[1]==&null) 76 { 77 now=now->s[0]; 78 return true; 79 } 80 else if (now->s[0]==&null) 81 { 82 now=now->s[1]; 83 return true; 84 } 85 _Node *p=now->s[1]; 86 while (p->s[0]!=&null) p=p->s[0]; 87 now->key=p->key; 88 succ=_del(now->s[1],p->key),d=1; 89 } 90 else 91 { 92 d=key>now->key; 93 succ=_del(now->s[d],key); 94 } 95 //_maintain(now,!d); 96 _update(now); 97 return succ; 98 } 99 void _print(_Node *now,int d) 100 { 101 for (int i=1;i<d;++i) printf(" "); 102 if (d) printf("|___"); 103 if (now==&null) printf("null\n"); 104 else 105 { 106 printf("[%d %d]\n",now->key,now->size); 107 _print(now->s[0],d+1); 108 _print(now->s[1],d+1); 109 } 110 } 111 public: 112 113 SizeBalancedTree() { root=&null; } 114 void insert(int k) { _ins(root,k); } 115 bool del(int k) { return _del(root,k); } 116 void print() { _print(root,0); } 117 118 int select(int k) 119 { 120 if (k>root->size) return -1; 121 int z=k-1; 122 _Node *now=root; 123 while (now->s[0]->size!=z) 124 { 125 if (now->s[0]->size<z) now=now->s[1],z-=now->s[0]->size+1; 126 else now=now->s[0]; 127 } 128 return now->key; 129 } 130 int get_rank(int k) 131 { 132 _Node *now=root;int ans=0; 133 while (now!=&null) 134 { 135 if (now->key<k) ans+=now->s[0]->size+1; 136 now=now->s[now->key<k]; 137 } 138 return ans+1; 139 } 140 int get_pre(int k) 141 { 142 _Node *now=root;int ans=-INF; 143 while (now!=&null) 144 { 145 if (now->key<k) ans=max(ans,now->key); 146 if (now->key==k) return k; 147 now=now->s[now->key<k]; 148 } 149 return ans==-INF?-1:ans; 150 } 151 int get_succ(int k) 152 { 153 _Node *now=root;int ans=INF; 154 while (now!=&null) 155 { 156 if (now->key>k) ans=min(ans,now->key); 157 if (now->key==k) return k; 158 now=now->s[now->key<k]; 159 } 160 return ans==INF?-1:ans; 161 } 162 }sbt; 163 164 int main() 165 { 166 char opt[2]; 167 int n,x; 168 freopen("test1.in","r",stdin); 169 freopen("test1_1.out","w",stdout); 170 scanf("%d",&n); 171 while (n--) 172 { 173 scanf("%s%d",opt,&x); 174 switch (opt[0]) 175 { 176 case 'I': 177 sbt.insert(x); 178 break; 179 case 'D': 180 if (!sbt.del(x)) puts("-1"); 181 break; 182 case 'P': 183 printf("%d\n",sbt.get_pre(x)); 184 break; 185 case 'S': 186 printf("%d\n",sbt.get_succ(x)); 187 break; 188 case 'R': 189 printf("%d\n",sbt.get_rank(x)); 190 break; 191 case 'C': 192 printf("%d\n",sbt.select(x)); 193 break; 194 } 195 } 196 return 0; 197 }
转载于:https://www.cnblogs.com/stickjitb/archive/2013/03/12/2956479.html
子树大小平衡树(SizeBalancedTree,SBT)——模板相关推荐
- Size Balanced Tree(节点大小平衡树)
定义 SBT也是一种自平衡二叉查找树,它的平衡原理是每棵树的大小不小于其兄弟树的子树的大小 即size(x->l)$\ge$size(x->r->l),size(x->r-&g ...
- 【BZOJ - 3224】普通平衡树(Splay模板题)
题干: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输出最 ...
- [学习笔记] 伸展树splay详解+全套模板+例题[Luogu P3369 【模板】普通平衡树]
文章目录 引入概念 全套模板 变量声明 update ==rotate旋转== splay操作 insert插入 delete删除 查找x的位置 查找第k大 前驱/后继 极小值-inf和极大值inf的 ...
- 带旋treap概念及模板,带例题:普通平衡树
带旋Treap 二叉查找树BST(Binary Search Tree)定义 Treap定义 模板合集(均为O(logn)O(logn)O(logn)) push_up模板 旋转模板 插入模板 删除模 ...
- 【洛谷P3369】 (模板)普通平衡树
https://www.luogu.org/problemnew/show/P3369 Splay模板 1 #include<iostream> 2 #include<cstdio& ...
- [洛谷P3391] 文艺平衡树 (Splay模板)
初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...
- 竞赛最好用的平衡树-Size Balanced Tree(SBT)【建议收藏】
大家好. 前段时间我更新过AVL.红黑树以及搜索二叉树的简单讲解.今天我们还是围绕着平衡树的话题,来讲解一个很牛逼的平衡树结构.这种结构是我国的一位大牛:陈启峰.在2006年,他还在读高中阶段,所发明 ...
- 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...
- CQF平衡树——SBT论文——Size Balanced Tree
Size Balanced Tree Size Balanced Tree(SBT)是一种平衡二叉查找树.它的论文由中国广东中山纪念中学的陈启峰于2006年底完成,并在Winter Camp 2007 ...
最新文章
- Android 自定义Dialog 的使用
- 网管必看的好东东(一)
- 学术写作利器——LaTeX入门笔记整理(不定期更新,附加使用心得)
- jQuery 判断鼠标键
- 环形均分纸牌问题(中位数)
- ios app抓包分析
- centos下eclipse的安装
- 七月算法机器学习2 数理统计与参数估计2
- Atitit 记录方法调用参数上下文arguments
- FlashFXP 5安装、远程访问服务器、以及修改密码
- 文件导入工具类--利用反射自动转换为list对象
- 中国象棋马走日 — 递归
- GitHub贡献统计
- Win10自动更新永久关闭Windows update medic service拒绝访问
- Crime Management CodeForces - 107D
- ACM初窥门径(一)
- win10安装linux系统视频播放器,u盘安装linux视频mac制作win10安装u盘
- incremental backups
- 【图像复原】RDN论文详解(Residual Dense Network for Image Restoration)
- 中国算力水平全球第二,数据中心发挥巨大作用