植树节,种一棵SBT玩玩,跑得不是很快…………不过还好吧…………

求各路神牛轻虐…………………

View Code

  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)——模板相关推荐

  1. Size Balanced Tree(节点大小平衡树)

    定义 SBT也是一种自平衡二叉查找树,它的平衡原理是每棵树的大小不小于其兄弟树的子树的大小 即size(x->l)$\ge$size(x->r->l),size(x->r-&g ...

  2. 【BZOJ - 3224】普通平衡树(Splay模板题)

    题干: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输出最 ...

  3. [学习笔记] 伸展树splay详解+全套模板+例题[Luogu P3369 【模板】普通平衡树]

    文章目录 引入概念 全套模板 变量声明 update ==rotate旋转== splay操作 insert插入 delete删除 查找x的位置 查找第k大 前驱/后继 极小值-inf和极大值inf的 ...

  4. 带旋treap概念及模板,带例题:普通平衡树

    带旋Treap 二叉查找树BST(Binary Search Tree)定义 Treap定义 模板合集(均为O(logn)O(logn)O(logn)) push_up模板 旋转模板 插入模板 删除模 ...

  5. 【洛谷P3369】 (模板)普通平衡树

    https://www.luogu.org/problemnew/show/P3369 Splay模板 1 #include<iostream> 2 #include<cstdio& ...

  6. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

  7. 竞赛最好用的平衡树-Size Balanced Tree(SBT)【建议收藏】

    大家好. 前段时间我更新过AVL.红黑树以及搜索二叉树的简单讲解.今天我们还是围绕着平衡树的话题,来讲解一个很牛逼的平衡树结构.这种结构是我国的一位大牛:陈启峰.在2006年,他还在读高中阶段,所发明 ...

  8. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  9. CQF平衡树——SBT论文——Size Balanced Tree

    Size Balanced Tree Size Balanced Tree(SBT)是一种平衡二叉查找树.它的论文由中国广东中山纪念中学的陈启峰于2006年底完成,并在Winter Camp 2007 ...

最新文章

  1. Android 自定义Dialog 的使用
  2. 网管必看的好东东(一)
  3. 学术写作利器——LaTeX入门笔记整理(不定期更新,附加使用心得)
  4. jQuery 判断鼠标键
  5. 环形均分纸牌问题(中位数)
  6. ios app抓包分析
  7. centos下eclipse的安装
  8. 七月算法机器学习2 数理统计与参数估计2
  9. Atitit  记录方法调用参数上下文arguments
  10. FlashFXP 5安装、远程访问服务器、以及修改密码
  11. 文件导入工具类--利用反射自动转换为list对象
  12. 中国象棋马走日 — 递归
  13. GitHub贡献统计
  14. Win10自动更新永久关闭Windows update medic service拒绝访问
  15. Crime Management CodeForces - 107D
  16. ACM初窥门径(一)
  17. win10安装linux系统视频播放器,u盘安装linux视频mac制作win10安装u盘
  18. incremental backups
  19. 【图像复原】RDN论文详解(Residual Dense Network for Image Restoration)
  20. 中国算力水平全球第二,数据中心发挥巨大作用

热门文章

  1. linux小程序实验报告,linux 小程序分析
  2. android画布_Android画布
  3. 简单java程序_简单的Java程序
  4. c语言如何将8个字符串串联_C ++中的字符串串联:串联字符串的4种方法
  5. 通过命令行启动uwp应用
  6. 高级开发进阶到架构师的必要条件是什么?
  7. OpenCV(二)OpenCV的介绍和发展
  8. Docker的安装与启动教程
  9. [BZOJ3684]大朋友和多叉树
  10. centos6.5 nginx开机启动