普通平衡树代码。。。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 ...
随机推荐
- Spring核心技术(五)——Spring中Bean的作用域
前文概述了Spring的容器,Bean,以及依赖的一些信息,本文将描述一下Bean的作用域 Bean的作用域 当开发者定义Bean的时候,同时也会定义了该如何创建Bean实例.这些具体创建的过程是很重 ...
- Ural 1114 Boxes
Boxes Time Limit: 600ms Memory Limit: 16384KB This problem will be judged on Ural. Original ID: 1114 ...
- asp.net mvc 4.0 新特性之移动特性
asp.net mvc 4.0 新特性之移动特性 为不同的客户端提供不同的视图 手动重写 UserAgent,从而强制使用对应的视图 示例1.演示如何为不同的客户端提供不同的视图Global.asax ...
- [luoguP2285] [HNOI2004]打鼹鼠(DP)
传送门 设f[i]表示i个鼹鼠出现后,打死鼹鼠的最大值 动态转移方程:f[i]=max{f[j]+1}, 条件:abs(x[i]-x[j])+abs(y[i]-y[j])<=time[i]-ti ...
- sql自增长和占位符?"相矛盾"的问题
1.对于sql server数据当数据被定义为自增长时,插入,无法将那个位置用字符占位,我们可以使用部分插入的方法来做. insert into users (username,email,grad ...
- Frame Stacking 拓扑排序 图论
Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ .... ...
- C/C++ Threads): Creating worker threads that will be listening to jobs and executing them concurrently when wanted
Suppose we have two workers. Each worker has an id of 0 and 1. Also suppose that we have jobs arrivi ...
- 大数据分析:结合 Hadoop或 Elastic MapReduce使用 Hunk
作者 Jonathan Allen ,译者 张晓鹏 Hunk是Splunk公司一款比較新的产品,用来对Hadoop和其他NoSQL数据存储进行探測和可视化,它的新版本号将会支持亚马逊的Elastic ...
- Codeforces Round #263 (Div. 1)-A,B,C
A: 这道题目还是非常easy的,做过非常多遍了.相似于分割木板的问题. 把全部的数放在一个优先队列里,弹出两个最大的,然后合并,把结果放进去.依次进行. #include <iostream& ...
- 记录 mysql sql limit 0,100问题
某个场景分页查询出第一页的数据,, limit 0,100 第一页 limit 100,100 第二页 limit 200,100 第三页 select * from user limit 0,10 ...