Treap标准模板
这是Treap的模板程序,支持Left/Right Rotate,Find the maxnum/minnum,Find the predecessor/successor of a node,Add/Delete nodes 等绝大多数功能(不包含类似于”查找排名第k的元素”这样奇怪的东西的代码)
#include<bits/stdc++.h>
#include<windows.h>
#define maxn 1000001
#define Random(x) (rand()%x)
#define ALLOW
#define query_pred_succ
#define query_delete using namespace std; typedef struct{
int leftnode,rightnode,data,fix; //data为数值,fix为修正值
bool symbol; //记录当前节点是否是空节点,0为空,1为非空
}node; class treap
{
public:
node p[maxn];
int size,root;
treap()
{
srand(time(0));
size=0;
root=0;
}
void Treap_Left_Rotate(int &x)
{
int y=p[x].rightnode;
p[x].rightnode=p[y].leftnode;
p[y].leftnode=x;
x=y;
}
void Treap_Right_Rotate(int &x)
{
int y=p[x].leftnode;
p[x].leftnode=p[y].rightnode;
p[y].rightnode=x;
x=y;
}
void Treap_insert(int &k,int key)
{
if (k==0)
{
k=++size;
p[k].leftnode=p[k].rightnode=0;
p[k].data=key;
p[k].fix=rand();
} else
if (key<p[k].data)
{
Treap_insert(p[k].leftnode,key);
if (p[p[k].leftnode].fix>p[k].fix)
Treap_Right_Rotate(k);
}
else
{
Treap_insert(p[k].rightnode,key);
if (p[p[k].rightnode].fix>p[k].fix)
Treap_Left_Rotate(k);
}
}
void Treap_delete(int &k,int key)
{
if (k==0) return;
if (key==p[k].data)
{
if (p[k].leftnode==0 && p[k].rightnode==0) k=0;
else if (p[k].leftnode==0 && p[k].rightnode!=0) k=p[k].rightnode;
else if (p[k].leftnode!=0 && p[k].rightnode==0) k=p[k].leftnode;
else
if (p[p[k].leftnode].fix<p[p[k].rightnode].fix)
{
Treap_Left_Rotate(k);
Treap_delete(p[k].leftnode,key);
}
else
{
Treap_Right_Rotate(k);
Treap_delete(p[k].rightnode,key);
}
} else
if (key<p[k].data) Treap_delete(p[k].leftnode,key);
else Treap_delete(p[k].rightnode,key);
}
void in_order_print(int k)
{
p[k].symbol=1;
if (p[k].leftnode!=0)
in_order_print(p[k].leftnode);
printf("第%d个节点 : 值:%d 修正值:%d 左孩子:%d 右孩子:%d\n",k,p[k].data,p[k].fix,p[k].leftnode,p[k].rightnode);
if (p[k].rightnode!=0)
in_order_print(p[k].rightnode);
}
int find_max(int k)
{
if (p[k].rightnode!=0)
return find_max(p[k].rightnode);
else return p[k].data;
}
int find_min(int k)
{
if (p[k].leftnode!=0)
return find_min(p[k].leftnode);
else return p[k].data;
}
int Treap_pred(int k,int key,int optimal)
{
if (!p[k].symbol) return optimal;
if (p[k].data<=key) return Treap_pred(p[k].rightnode,key,k);
else return Treap_pred(p[k].leftnode,key,optimal);
}
int Treap_succ(int k,int key,int optimal)
{
if (!p[k].symbol) return optimal;
if (p[k].data>=key) return Treap_succ(p[k].leftnode,key,k);
else return Treap_succ(p[k].rightnode,key,optimal);
}
}; treap T;
int main()
{
int n,m;
#ifdef ALLOW
MessageBox(NULL,"This program is the standard Treap code\nAbility:Left/Right Rotate,Find the maxnum/minnum,Find the predecessor/successor of a node,Add/Delete nodes\n","Tips",MB_OK);
#endif
printf("Input the total nodes number:\n");
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
int tmp;
printf("No.%d : You want to insert:",i);
scanf("%d",&tmp);
T.Treap_insert(T.root,tmp);
} printf("After inserting,the Treap is:\n");
T.in_order_print(T.root);
printf("MAXNUM: %d\n",T.find_max(T.root));
printf("MINNUM: %d\n",T.find_min(T.root));
#ifdef query_pred_succ
printf("How many nodes do you want to look for its predecessor/successor?\n");
scanf("%d",&m);
if (m>0)
{
printf("Input format for looking for the predecessor:P num\n");
printf("Input format for looking for the successor :S num\n");
char cmd;
int tmp;
int a=1;
while (a<=n)
{
cin>>cmd>>tmp;
if (cmd=='P') printf("%d\n",T.Treap_pred(T.root,tmp,0));
else if (cmd=='S') printf("%d\n",T.Treap_succ(T.root,tmp,0));
else MessageBox(NULL,"Unknown Command Type\nPlease Input Again.","Error",MB_OK),a--;
a++;
}
}
#endif
#ifdef query_delete
printf("How many nodes would you like to delete?(The number you input must be below%d)\n",n);
scanf("%d",&m);
if (m>n)
{
MessageBox(NULL,"The number you inputed just now is too big!!!","Error",MB_OK);
return -1;
}
for (int i=1;i<=m;i++)
{
int tmp;
printf("No.%d : You want to delete the node with value",i);
scanf("%d",&tmp);
T.Treap_delete(T.root,tmp);
T.in_order_print(T.root);
}
#endif
return 0;
}
Treap标准模板的更多相关文章
- STL标准模板库(简介)
标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...
- treap树模板
///treap树模板 typedef struct Node ///节点的结构体 { Node *l,*r; int val,pri; ///节点的值和优先级 int sz; ///节点子树的节点数 ...
- 【转】C++标准库和标准模板库
C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费 ...
- STL标准模板库介绍
1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的 ...
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- 【c++】标准模板库STL入门简介与常见用法
一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...
- C++之路起航——标准模板库(vector)
vector(动态数组或向量):动态分配内存空间的线性储存结构. 需要包括头文件<vector> 定义: vector<数据类型> 变量名: Eg: vector<int ...
- C++——string类和标准模板库
一.string类 1.构造函数 string实际上是basic_string<char>的一个typedef,同时省略了与内存管理相关的参数.size_type是一个依赖于实现的整型,是 ...
- STL 简介,标准模板库
这篇文章是关于C++语言的一个新的扩展--标准模板库的(Standard Template Library),也叫STL. 当我第一次打算写一篇关于STL的文章的时候,我不得不承认我当时低估了这个话 ...
随机推荐
- 利用multiprocessing.managers开发跨进程生产者消费者模型
研究了下multiprocessing.managers,略有收获,随笔一篇: 核心思路是构造一个manager进程,这个进程可以通过unix socket或tcp socket与其它进程通信:因为利 ...
- vue-cli —— 局部修改Element样式
最近在做vue项目时用到了Element,发现这玩意儿用起来很舒服,很新颖,上手也很快,而且效果足够酷炫.但是后面发现一个很大的问题,那就是Element的样式有限,这极大地限制了项目的应用广度,所以 ...
- IDEA Failed to load dx.jar
IDEA-177053 Android app crashes on build "Failed to load dx.jar" Error:Android Pre Dex: [c ...
- c语言的一些易错知识积累
1. #ifdef 和#if defined 的区别: 后者可以组成复杂的预编译条件,而如果判断的是单个宏定义的时候,两种用法的效果都是一样的. 2.#if 0 { code }#endif ...
- 《CSS世界》读书笔记(十三)
<!-- <CSS世界>张鑫旭著 --> margin 无效情形解析 (1)display 计算值 inline 的非替换元素的垂直 margin 是无效的.对于内联替换元素, ...
- vue 学习链接地址
使用Vue.js构建Web应用程序 http://www.jdon.com/48545# 一步步带你做vue后台管理框架(一)——介绍框架 http://www.cnblogs.com/herozho ...
- MongoDB --- 02. 基本操作,增删改查,数据类型,比较符,高级用法,pymongo
一.基本操作 . mongod 启动服务端 2. mongo 启动客户端 3. show databses 查看本地磁盘的数据库 4. use 库名 切换到要使用的数据库 5. db 查看当前使用的数 ...
- 解决js的 Math取正弦值 余弦值不准确的问题
//角度 var vAngle=90: //正弦值 var vSin=Math.round(Math.sin((vAngle * Math.PI/180)) * 1000000) / 1000000 ...
- Bootstrap3基础 栅格系统 标尺(col-lg/md/sm/xs-1)
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...
- HTML5滚动加载
@using YoSoft.DSM.YoDSMModel;@using YoSoft.DSM.YoDSMBLL;@{ Layout = "~/Views/Shared/_LayoutComp ...