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

 #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. python爬虫25 | 爬取下来的数据怎么保存? CSV 了解一下

    大家好 我是小帅b 是一个练习时长两年半的练习生 喜欢 唱! 跳! rap! 篮球! 敲代码! 装逼! 不好意思 我又走错片场了 接下来的几篇文章 小帅b将告诉你 如何将你爬取到的数据保存下来 有文本 ...

  2. wannafly-day1 Problem A - Birthday

    思路:队友贪心WA了,然后就没有然后了,自己也是第一次接触最小费用流的题.借这个题来学习一下,利用Spfa每次来找到一个最短的路径同时保存路径,每一次寻找最短路径就将这条路的最小费用流给剪掉,然后继续 ...

  3. idea 背景颜色设置

    1. 设置当前鼠标所在行颜色 2. 设置编辑区颜色

  4. BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)

    题目连接: (luogu) https://www.luogu.org/problemnew/show/P2604 (bzoj) https://www.lydsy.com/JudgeOnline/p ...

  5. 实例:Mongodb集群配置过程

    最近因为一些项目公司开始采用Mongodb做为大量的数据存储,通过网络上大量的资源自己已经掌握一套可行的Mongodb集群配置过程,Mongodb具有无规则存储.大数据存储.多平台支持.强大的扩展插件 ...

  6. Lein: Exception in thread "Thread-3" java.net.ConnectException: Connection refused

    leiningen Leiningen是你的主要工具, 它用于: 启动一个 REPL 下载+安装类库 运行你的程序 启动一个服务器, 运行你所写的webapps 安装 brew install lei ...

  7. ubuntu 建立加密分區及其安全刪除

    加密分區1: sudo apt-get install cryptsetup2: 用“磁盤實用工具“,建立新的分區 或者 格式化現有分區,且勾選“加密底層設備“,按提示設定密碼3:同時選擇加密條件:i ...

  8. ios7新增api实现扫描二维码

    本来用的ZBar开源库实现的扫描二维码,可是貌似不支持arm64了,也没有在更新. 如今不用适配ios7下面.而iOS新增系统API已支持扫码,參考老外的一篇博客做了个demo.须要的能够參考下 參考 ...

  9. Effective C++ Item 44 将与參数无关的代码抽离 templates

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:Templates 生成多个 classes 和多个函数,所以不论什么 templat ...

  10. A new Graph Game

    点击打开链接 题意:给你一张N个节点的无向图.然后给出M条边,给出第 I 条边到第J条边的距离.然后问你是否存在子环,假设存在,则输出最成环的最短距离和 解析:构图:选定源点及汇点,然后将源点至个点流 ...