模板 普通平衡树

Treap 版:

查询操作是最简单的,就是二叉搜索树。左旋右旋画一画就好了。

最近代码能力下降,码一码模板QAQ

  1 #include<ctime>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cstdlib>
  5 #include<algorithm>
  6 using namespace std;
  7 struct pnt{
  8     int val;
  9     int l;
 10     int r;
 11     int rdm;
 12     int num;
 13     int    wgt;
 14 };
 15 struct treap{
 16     pnt tr[1000000];
 17     int siz;
 18     int root;
 19     int ans;
 20     void Tupdate(int spc)
 21     {
 22         tr[spc].wgt=tr[tr[spc].l].wgt+tr[tr[spc].r].wgt+tr[spc].num;
 23         return ;
 24     }
 25     void Trturn(int &spc)
 26     {
 27         int tmp=tr[spc].r;
 28         tr[spc].r=tr[tmp].l;
 29         tr[tmp].l=spc;
 30         tr[tmp].wgt=tr[spc].wgt;
 31         Tupdate(spc);
 32         spc=tmp;
 33     }
 34     void Tlturn(int &spc)
 35     {
 36         int tmp=tr[spc].l;
 37         tr[spc].l=tr[tmp].r;
 38         tr[tmp].r=spc;
 39         tr[tmp].wgt=tr[spc].wgt;
 40         Tupdate(spc);
 41         spc=tmp;
 42     }
 43     void Tinsert(int &spc,int v)
 44     {
 45         if(spc==0)
 46         {
 47             spc=++siz;
 48             tr[spc].val=v;
 49             tr[spc].num=tr[spc].wgt=1;
 50             tr[spc].rdm=rand();
 51             return ;
 52         }
 53         tr[spc].wgt++;
 54         if(tr[spc].val==v)
 55         {
 56             tr[spc].num++;
 57         }else if(tr[spc].val>v)
 58         {
 59             Tinsert(tr[spc].l,v);
 60             if(tr[spc].rdm>tr[tr[spc].l].rdm)
 61                 Tlturn(spc);
 62         }else{
 63             Tinsert(tr[spc].r,v);
 64             if(tr[spc].rdm>tr[tr[spc].r].rdm)
 65                 Trturn(spc);
 66         }
 67     }
 68     void Tdelete(int &spc,int v)
 69     {
 70         if(spc==0)
 71             return ;
 72         if(tr[spc].val==v)
 73         {
 74             if(tr[spc].num>1)
 75             {
 76                 tr[spc].wgt--;
 77                 tr[spc].num--;
 78                 return ;
 79             }
 80             if(tr[spc].num==1)
 81             {
 82                 if(tr[spc].l*tr[spc].r==0)
 83                 {
 84                     spc=tr[spc].l+tr[spc].r;
 85                 }else{
 86                     if(tr[tr[spc].l].rdm>tr[tr[spc].r].rdm)
 87                     {
 88                         Trturn(spc);
 89                         Tdelete(spc,v);
 90                     }else{
 91                         Tlturn(spc);
 92                         Tdelete(spc,v);
 93                     }
 94                 }
 95                 return ;
 96             }
 97
 98         }else if(tr[spc].val>v)
 99         {
100             tr[spc].wgt--;
101             Tdelete(tr[spc].l,v);
102         }else{
103             tr[spc].wgt--;
104             Tdelete(tr[spc].r,v);
105         }
106     }
107     int Trank(int spc,int v)
108     {
109         if(!spc)
110         {
111             return 0;
112         }
113         if(tr[spc].val==v)
114         {
115             return tr[tr[spc].l].wgt+1;
116         }else if(tr[spc].val>v)
117         {
118             return Trank(tr[spc].l,v);
119         }else{
120             return Trank(tr[spc].r,v)+tr[spc].num+tr[tr[spc].l].wgt;
121         }
122     }
123     int Tnum(int spc,int rnk)
124     {
125         if(!spc)
126         {
127             return 0;
128         }
129         if(tr[tr[spc].l].wgt>=rnk)
130         {
131             return Tnum(tr[spc].l,rnk);
132         }else if(tr[spc].num+tr[tr[spc].l].wgt<rnk)
133         {
134             return Tnum(tr[spc].r,rnk-tr[spc].num-tr[tr[spc].l].wgt);
135         }else{
136             return tr[spc].val;
137         }
138     }
139     void Tlasmx(int spc,int v)
140     {
141         if(!spc)
142             return ;
143         if(tr[spc].val>=v)
144         {
145             Tlasmx(tr[spc].l,v);
146         }else{
147             ans=tr[spc].val;
148             Tlasmx(tr[spc].r,v);
149         }
150         return ;
151     }
152     void Tnxtmn(int spc,int v)
153     {
154         if(!spc)
155             return ;
156         if(tr[spc].val<=v)
157         {
158             Tnxtmn(tr[spc].r,v);
159         }else{
160             ans=tr[spc].val;
161             Tnxtmn(tr[spc].l,v);
162         }
163         return ;
164     }
165     void Trun(int opt,int x)
166     {
167         switch(opt)
168         {
169             case 1:
170                 Tinsert(root,x);
171                 break;
172             case 2:
173                 Tdelete(root,x);
174                 break;
175             case 3:
176                 printf("%d\n",Trank(root,x));
177                 break;
178             case 4:
179                 printf("%d\n",Tnum(root,x));
180                 break;
181             case 5:
182                 ans=0;
183                 Tlasmx(root,x);
184                 printf("%d\n",ans);
185                 break;
186             case 6:
187                 ans=0;
188                 Tnxtmn(root,x);
189                 printf("%d\n",ans);
190                 break;
191         }
192     }
193 }T;
194 int n,opt,x;
195 int main()
196 {
197     srand(time(NULL));
198     scanf("%d",&n);
199     while(n--)
200     {
201         scanf("%d%d",&opt,&x);
202         T.Trun(opt,x);
203     }
204     return 0;
205 }

原文地址:https://www.cnblogs.com/blog-Dr-J/p/9452399.html

时间: 2024-10-19 02:22:27

模板 普通平衡树的相关文章

luoguP3369[模板]普通平衡树(Treap/SBT) 题解

链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<cstring> #include<iomanip> #include<algorithm> #include<ctime> #include<queue> #incl

模板 文艺平衡树

Splay模板,学完觉得比Treap简单,不过均摊的logn不能可持久化. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define ls ch[0] 5 #define rs ch[1] 6 struct trnt{ 7 int ch[2]; 8 int chd; 9 int wgt; 10 int fa; 11 int v; 12 }tr[10000000]; 13 int root

平衡树解析

转自:yyb巨佬的平衡树 不知道splay是啥,,你也要知道平衡树是啥... 平衡树是一个神奇的数据结构, 对于任意一个节点,左儿子的值比它小,右儿子的值比它大 并且任意一棵子树单独拎出来也是一棵平衡树 就像这样.... 各位大佬请原谅我丑陋无比的图 上面这个丑陋的东西就是一棵平衡树,他现在很平衡,是一棵满二叉树,高度正好是logn... 但是.. 如果这个丑陋的东西极端一点,他就会变成这样... 这张图依然很丑 现在看起来,这个东西一点都不平衡... 二叉树退化成了一条链 如果要查询的话,,,

平衡树 fhqTreap 区间操作

//Treap fhq版(不旋转) //此模板为平衡树维护区间操作的模板 //注:在区间操作中split()标准变为子树大小 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<queue> #define INF 0x3f3f3f3f #de

数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline __attri\ bute__( ( optimize( "-O2" ) ) ) Inline void read (int &now) { now = 0; register char word = getchar (); bool temp = false; while (wor

平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】

平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是将有向树的所有边看成无向边形成的树状图.树是一种递归的数据结构,所以我们研究树也是按照递归的方式去研究的. 2.什么是二叉树. 我们给出二叉树的递归定义如下: (1)空树是一个二叉树. (2)单个节点是一个二叉树. (3)如果一棵树中,以它的左右子节点为根形成的子树都是二叉树,那么这棵树本身也是二叉

【Treap模板详细注释】BZOJ3224-普通平衡树

模板题:D错因见注释 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int INF=0x7fffffff; 8 struct treap 9 { 10 treap* lson; 11 treap* rson; 12 int key;/

HDU The kth great number 优先队列、平衡树模板题(SBT)

The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) [Problem Description] Xiao  Ming  and  Xiao  Bao  are  playing  a  simple  Numbers  game.  In  a  round  Xiao  Ming  can choose  to  write  down 

P3391 【模板】文艺平衡树(Splay)

题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 输入输出格式 输入格式: 第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2, \cdots n-1,n)(1,2,?n?1,n) m表示翻转操作次数 接下来m行每行两个数 [l,r][l,r] 数据保证 1 \leq l \leq r