普通平衡树代码。。。Treap
应一些人之邀。。。发一篇代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring> using namespace std;
struct node
{
int data;
int key;
node* ls;
node* rs;
int size; node()
{
key=rand();
}
}no[]; void update(node* now)
{
now->size=;
if (now->ls) now->size+=now->ls->size;
if (now->rs) now->size+=now->rs->size;
} node* merge(node* a,node* b)
{
if (!a) {update(b);return b;}
if (!b) {update(a);return a;}
if (a->key<b->key)
{
a->rs=merge(a->rs,b);
update(a);
return a;
}
else
{
b->ls=merge(a,b->ls);
update(b);
return b;
}
} struct nodepair
{
node* l;
node* r; nodepair(node* a,node* b)
{
l=a;
r=b;
}
}; nodepair split(node* a,int k)
{
if (!a) return nodepair(NULL,NULL);
if (a->data<=k)
{
nodepair km=split(a->rs,k);
a->rs=km.l;
update(a);
return nodepair(a,km.r);
}
else
{
nodepair km=split(a->ls,k);
a->ls=km.r;
update(a);
return nodepair(km.l,a);
}
} nodepair splitTh(node* a,int k)
{
if (!a) return nodepair(NULL,NULL);
if (!k) return nodepair(NULL,a);
if (a->ls)
{
if (a->ls->size>=k)
{
nodepair km=splitTh(a->ls,k);
a->ls=km.r;
update(a);
return nodepair(km.l,a);
}
else
{
nodepair km=splitTh(a->rs,k-a->ls->size-);
a->rs=km.l;
update(a);
return nodepair(a,km.r);
}
}
else
{
nodepair km=splitTh(a->rs,k-);
a->rs=km.l;
update(a);
return nodepair(a,km.r);
}
} int cnt=-;
node* insert(node* root,int newdata)
{
node* q=&no[++cnt];
q->data=newdata;
nodepair km=split(root,newdata);
return merge(km.l,merge(q,km.r));
} node* delate(node* root,int newdata)
{
nodepair km=split(root,newdata-);
nodepair km2=splitTh(km.r,);
return merge(km.l,km2.r);
} int getKth(node* now,int k)
{
if (!now) return -;
if (now->ls)
{
if (now->ls->size<k-)
return getKth(now->rs,k-now->ls->size-);
if (now->ls->size==k-)
return now->data;
if (now->ls->size>k-)
return getKth(now->ls,k);
}
else
{
if (k==) return now->data;
return getKth(now->rs,k-);
}
} node* Search(node* root,int k,int* ans)
{
nodepair km=split(root,k-);
if (km.l)
*ans=km.l->size+;
else
*ans=;
return merge(km.l,km.r);
} node* getQQ(node* root,int data,int* ans)
{
nodepair km=split(root,data-);
nodepair km2=splitTh(km.l,km.l->size-);
*ans=km2.r->data;
return merge(km2.l,merge(km2.r,km.r));
} node* getHJ(node* root,int data,int* ans)
{
nodepair km=split(root,data);
nodepair km2=splitTh(km.r,);
*ans=km2.l->data;
return merge(km.l,merge(km2.l,km2.r));
} int main()
{
node* root=NULL;
int n,cmd,k;
scanf("%d",&n);
for (int i=;i<=n;++i)
{
scanf("%d%d",&cmd,&k);
if (cmd==){root=insert(root,k);}
if (cmd==){root=delate(root,k);}
if (cmd==)
{
int ans=;
root=Search(root,k,&ans);
printf("%d\n",ans);
}
if (cmd==)
{
printf("%d\n",getKth(root,k));
}
if (cmd==)
{
int ans=;
root=getQQ(root,k,&ans);
printf("%d\n",ans);
}
if (cmd==)
{
int ans=;
root=getHJ(root,k,&ans);
printf("%d\n",ans);
}
}
return ;
}
普通平衡树代码。。。Treap的更多相关文章
- Hihocoder 1325 平衡树·Treap(平衡树,Treap)
Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...
- AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369
[模板]普通平衡树(Treap/SBT) 思路: 劳资敲了一个多星期: 劳资终于a了: 劳资一直不a是因为一个小错误: 劳资最后看的模板: 劳资现在很愤怒: 劳资不想谈思路!!! 来,上代码: #in ...
- 初涉平衡树「treap」
treap:一种平衡的二叉搜索树 什么是treap(带旋) treap=tree+heap,这大家都知道.因为二叉搜索树(BST)非常容易被卡成一条链而影响效率,所以我们需要一种更加平衡的树形结构,从 ...
- 2021.12.08 平衡树——FHQ Treap
2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...
- [luogu P3369]【模板】普通平衡树(Treap/SBT)
[luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...
- 编程算法 - 推断二叉树是不是平衡树 代码(C)
推断二叉树是不平衡树 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一颗二叉树的根结点, 推断该树是不是平衡二叉树. 二叉平衡树: 随意结 ...
- 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...
- 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...
- 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...
随机推荐
- MySQL Insert数据量过大导致报错 MySQL server has gone away
接手了同事的项目,其中有一个功能是保存邮件模板(包含图片),同事之前的做法是把图片进行base64编码然后存在mysql数据库中(字段类型为mediumtext)然后保存三张图片(大概400k)的时候 ...
- mess系统 开发技术,需求整理
1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源(如html 页 ...
- 洛谷 4246 BZOJ 1018 [SHOI2008]堵塞的交通
[题解] 原来线段树还可以这么玩.. 我们用线段树维护连通性.对于一个矩形,我们用4个标记维护4个点的联通情况,再用两个标记维护右边两个点与它们右边的与它们在同一行的点的联通情况. 画图表示,就是 另 ...
- 哈希表模板(Hash set)
省选前最后的复(chui si)习(zheng zha). 上模板吧 namespace Hash_Table{ #define inf ~0U>>1 #define MaxN 10010 ...
- java 生成20位唯一ID,生成不会重复的20位数字----https://blog.csdn.net/weixin_36751895/article/details/70331781
java 生成20位唯一ID,生成不会重复的20位数字----https://blog.csdn.net/weixin_36751895/article/details/70331781
- HUD 1043 Eight 八数码问题 A*算法 1667 The Rotation Game IDA*算法
先是这周是搜索的题,网站:http://acm.hdu.edu.cn/webcontest/contest_show.php?cid=6041 主要内容是BFS,A*,IDA*,还有一道K短路的,.. ...
- [luoguP1076] 寻宝(模拟)
传送门 模拟就好! 然后需要把一圈的有楼梯的都记录一下,取膜乱搞. 代码 #include <cstdio> #include <iostream> #define N 100 ...
- jquery追加元素的几种方法(append()、prepend()、after()、before()、insertAfter()、insertBefore())
最近项目不是很忙,抽空整理了下,js中常用追加元素的几种方法. <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- 小a和uim之大逃离(洛谷 1373)
题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...
- vim下多行注释与解注释
1.多行注释 (1)按esc进入命令行模式 (2)按下Ctrl+v,进入区块模式,并使用上下键选择需要注释的多行 (3)按下“I”(大写)键,进入插入模式 (4)输入注释符(“//”或“#”等) (5 ...