treap插入、删除、查询时间复杂度均为O(logn)

treap树中每个节点有两种权值:键值和该节点优先值

如果只看优先值,这棵树又是一个堆

treap有两种平衡方法:左旋&右旋

insert 插入

remove 删除

_find 查找

kth 返回root为根的树中第k大的元素

 #include <iostream>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cstdio>
using namespace std; struct Node
{
Node* ch[];
int r,v,s; //r:随机优先级,v:值,s:以本节点为根的子树的结点总数
bool operator < (const Node& rhs)
{
return (r<rhs.r);
}
int cmp(int x)
{
if (x==v) return -;
return x<v?:;
}
void maintain()
{
s=;
if (ch[]!=NULL) s+=ch[]->s;
if (ch[]!=NULL) s+=ch[]->s;
}
Node (int v):v(v) //结构体的构造函数
{
ch[]=ch[]=NULL;
r=rand();
s=;
}
}; void rotate(Node* &o,int d)
{
Node* k=o->ch[d^];
o->ch[d^]=k->ch[d];
k->ch[d]=o;
o->maintain();
k->maintain();
o=k;
} void insert(Node* &o,int x)
{
if (o==NULL)
o=new Node(x);
else
{
//int d=o->cmp(x); //不用cmp
int d=(x < o->v ? : );
insert(o->ch[d],x);
if (o->ch[d]->r > o->r)
rotate(o,d^);
}
o->maintain();
} void remove(Node* &o,int x)
{
int d=o->cmp(x);
if (d==-)
{
Node *u=o;
if ((o->ch[]!=NULL) && (o->ch[]!=NULL))
{
int d2=(o->ch[]->r > o->ch[]->r ? : );
rotate(o,d2);
remove(o->ch[d2],x);
}
else
{
if (o->ch[]==NULL)
o=o->ch[];
else
o=o->ch[];
delete u;
}
}
else
remove(o->ch[d],x);
if (o!=NULL)
o->maintain();
} int kth(Node* o,int k)
{
if ((o==NULL)||(k<=)||(k > o->s))
return ;
int s=(o->ch[]==NULL ? : o->ch[]->s);
if (k==s+)
return o->v;
else if (k<=s)
return kth(o->ch[],k);
else
return kth(o->ch[],k-s-); } int _find(Node* o,int x)
{
while (o!=NULL)
{
int d=o->cmp(x);
if (d==-)
return ;
else
o=o->ch[d];
}
return ;
} int main()
{
//freopen("in.txt","r",stdin); int n,m,opr,x;
srand(time());
cin>>n;
Node* root=new Node();
for (int i=;i<=n;i++)
{
cin>>opr>>x;
if (opr==)
{
insert(root,x);
}
else if (opr==)
{
if (!_find(root,x))
cout<<"Not Found,Operation Failed"<<endl;
else
remove(root,x);
}
}
cout<<"-----------------"<<endl;
cin>>m;
for (int i=;i<=m;i++)
{
cin>>x;
if (_find(root,x))
cout<<"Found"<<endl;
else
cout<<"Not Found"<<endl;
}
cout<<"-----------------"<<endl;
cin>>m;
for (int i=;i<=m;i++)
{
cin>>x;
int ans=kth(root,x);
cout<<x<<"th: "<<ans<<endl;
}
}

PS:发现一个画图论图形的神器:GraphViz

Treap实现山寨set的更多相关文章

  1. fhq treap最终模板

    新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...

  2. 山寨Unity3D?搜狐畅游的免费开源游戏引擎Genesis-3D

    在CSDN上看到了<搜狐畅游发布3D游戏引擎Genesis-3D 基于MIT协议开源>(http://www.csdn.net/article/2013-11-21/2817585-cha ...

  3. 让我们山寨一张Windows Azure Global的壁纸

    用过国际版Azure的同学都见过一个显示了机器中主要信息的壁纸,而这个壁纸是通过Sysinternals的一款叫做bginfo来实现的,这款软件的好处是对于批量管理主(虚拟)机的管理员和使用方都很实用 ...

  4. [翻译+山寨]Hangfire Highlighter Tutorial

    前言 Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows ...

  5. BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]

    1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 786  Solved: 391[Submit][S ...

  6. BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]

    1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1318  Solved: 498[Submit][ ...

  7. 非旋treap模板

    bzoj3580 非旋转treap 在大神教导下发现split一段区间时先split右边再split左边比较好写 #include <cstdio> #include <cstdli ...

  8. 从零开始山寨Caffe·陆:IO系统(一)

    你说你学过操作系统这门课?写个无Bug的生产者和消费者模型试试! ——你真的学好了操作系统这门课嘛? 在第壹章,展示过这样图: 其中,左半部分构成了新版Caffe最恼人.最庞大的IO系统. 也是历来最 ...

  9. NanUI for Winform 使用示例【第一集】——山寨个代码编辑器

    NanUI for Winform从昨天写博客发布到现在获得了和多朋友的关注,首先感谢大家的关注和支持!请看昨天本人的博文<NanUI for Winform发布,让Winform界面设计拥有无 ...

随机推荐

  1. dalvik

    Google公司自己设计用于Android平台的Java虚拟机

  2. Linux由管道组成的值得学习的命令

    1.Linux查找不以#开头的行的命令如:cat /etc/vsftpd/vsftpd.conf | grep -v "#"

  3. Fidder--实现手机的抓包

    今天闲着没吊事,来写一篇关于怎么抓取Android中的app数据包?工欲行其事,必先利其器,上网google了一下,发现了一款神器:Fiddler,这个貌似是所有软件开发者必备神器呀!这款工具不仅可以 ...

  4. java11-3 String类的获取功能

    String类的获取功能 int length():获取字符串的长度. char charAt(int index):获取指定索引位置的字符 int indexOf(int ch):返回指定字符在此字 ...

  5. Linux下利用CGroup控制CPU、内存以及IO的操作记录

    CGroup及其子系统的介绍在这里就不赘述了,可以参考:Linux下CGroup使用说明梳理废话不多说,这里记录下利用CGroup控制CPU.内存以及IO的操作记录: libcgroup工具安装这里以 ...

  6. 24Mybatis_延迟加载——用association来实现

    resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: 如果查询订单并且关 ...

  7. C语言中的深拷贝和浅拷贝

    //C语言中的深拷贝和浅拷贝 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #inc ...

  8. C语言 百炼成钢8

    //题目22:两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定 //比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x, z比,请编程序找出 //三 ...

  9. How to install 64-bit Google Chrome 28+ on 64-bit RHEL/CentOS 6 or 7

    How to install 64-bit Google Chrome 28+ on 64-bit RHEL/CentOS 6 or 7 The problem Google developers s ...

  10. [转]World Wind Java开发之四——搭建本地WMS服务器

    在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...