应一些人之邀。。。发一篇代码

 #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的更多相关文章

  1. Hihocoder 1325 平衡树·Treap(平衡树,Treap)

    Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...

  2. 洛谷P3369 【模板】普通平衡树(Treap/SBT)

    洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...

  3. AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369

    [模板]普通平衡树(Treap/SBT) 思路: 劳资敲了一个多星期: 劳资终于a了: 劳资一直不a是因为一个小错误: 劳资最后看的模板: 劳资现在很愤怒: 劳资不想谈思路!!! 来,上代码: #in ...

  4. 初涉平衡树「treap」

    treap:一种平衡的二叉搜索树 什么是treap(带旋) treap=tree+heap,这大家都知道.因为二叉搜索树(BST)非常容易被卡成一条链而影响效率,所以我们需要一种更加平衡的树形结构,从 ...

  5. 2021.12.08 平衡树——FHQ Treap

    2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...

  6. [luogu P3369]【模板】普通平衡树(Treap/SBT)

    [luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...

  7. 编程算法 - 推断二叉树是不是平衡树 代码(C)

    推断二叉树是不平衡树 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一颗二叉树的根结点, 推断该树是不是平衡二叉树. 二叉平衡树: 随意结 ...

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

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...

  9. 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...

  10. 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...

随机推荐

  1. mac下Redis安装和使用

    前言 本篇文章主要讲述了Mac下Redis的安装和使用的经验,并将python如何操作Redis做了简单介绍. 1. redis 安装 和启动 1.1 用brew安装 查看系统是否已经安装了Redis ...

  2. Django DTL模板语法中的判断

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. sectional data interpolation in Tecplot

    $!Varset |NumLoop|= $!Loop |NumLoop| $!Varset |num|=(|Loop|*+) $!RotateData ZoneList = [] Angle = |n ...

  4. java--删除链表偶数节点

    public class ListNode { int data;//当前节点的值 ListNode next = null;//是指向下一个节点的指针/引用 public ListNode(int ...

  5. 关于js中的事件委托小案例

    需求:页面上有一个按钮,和一个空的ul,要求点击按钮,会给ul中动态添加li元素,然后,点击动态添加的元素,在控制台上输出,这是第几个元素 <ul> </ul> <but ...

  6. BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)

    字符串终于告一段落了! 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3993 (luogu) https://www.l ...

  7. 【01】CSS3 Gradient 分为 linear-gradient(线性渐变)和 radial-gradient(径 向渐变)(转)

    CSS3 Gradient 分为 linear-gradient(线性渐变)和 radial-gradient(径 向渐变).而我们今天主要是针对线性渐变来剖析其具体的用法.为了更好的应用 CSS3 ...

  8. Neo4j ETL工具快速上手:简化从关系数据库到图数据库的数据迁移

    注:本文系从https://medium.com/neo4j/tap-into-hidden-connections-translating-your-relational-data-to-graph ...

  9. CODEVS——T 2956 排队问题

    http://codevs.cn/problem/2956/  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descri ...

  10. Spring Boot配置文件规则以及使用方法官方文档查找以及Spring项目的官方文档查找方法

    比如要使用Spring Boot实现一个功能,最直接的方式是Google,但是往往搜索出来的都比较乱,关键是乱在不同的版本上,比如1.x版本和2.x版本的配置是不一样的.最明显区别是在使用Thymel ...