Treap标准模板

时间:2022-09-16 08:12:07

这是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标准模板的更多相关文章

  1. STL标准模板库(简介)

    标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...

  2. treap树模板

    ///treap树模板 typedef struct Node ///节点的结构体 { Node *l,*r; int val,pri; ///节点的值和优先级 int sz; ///节点子树的节点数 ...

  3. 【转】C&plus;&plus;标准库和标准模板库

    C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费 ...

  4. STL标准模板库介绍

    1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的 ...

  5. BZOJ 3224 TYVJ 1728 普通平衡树 &lbrack;Treap树模板&rsqb;

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 7390  Solved: 3122 [Submit][S ...

  6. 【c&plus;&plus;】标准模板库STL入门简介与常见用法

    一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...

  7. C&plus;&plus;之路起航——标准模板库(vector)

    vector(动态数组或向量):动态分配内存空间的线性储存结构. 需要包括头文件<vector> 定义: vector<数据类型> 变量名: Eg: vector<int ...

  8. C&plus;&plus;——string类和标准模板库

    一.string类 1.构造函数 string实际上是basic_string<char>的一个typedef,同时省略了与内存管理相关的参数.size_type是一个依赖于实现的整型,是 ...

  9. STL 简介,标准模板库

    这篇文章是关于C++语言的一个新的扩展--标准模板库的(Standard Template Library),也叫STL.  当我第一次打算写一篇关于STL的文章的时候,我不得不承认我当时低估了这个话 ...

随机推荐

  1. 修改Tomcat可支持get形式url长度

    maxHttpHeaderSize="8192" 加在 <Connector port="8081" maxHttpHeaderSize="31 ...

  2. mysql的事务处理与锁表

    数据库的事务处理可以保证一组处理结果的正确性.mysql中只有INNODB和BDB引擎的数据表才支持事务处理,对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法来实现相同的功能. mysql的 ...

  3. OpenJudge计算概论-第二个重复出现的数

    /*======================================================================== 第二个重复出现的数 总时间限制: 1000ms 内 ...

  4. Java之--Java语言基础组成(关键字、标识符、注释、常量和变量、运算符)

    Java语言基础组成-关键字.标识符.注释.常量和变量.运算符 Java语言由8个模块构成,分别为:1.关键字:2.标识符(包名.类名.接口名.常量名.变量名等):3.注释:4.常量和变量:5.运算符 ...

  5. js 返回的数据类型 5类

    对变量或值调用 typeof 运算符将返回下列值之一: undefined - 如果变量是 Undefined 类型的 boolean - 如果变量是 Boolean 类型的 number - 如果变 ...

  6. Oracle工程师技能树

    整理了份Oracle工程师的技能树,方便大家在学习的过程中有个大体方向. 欢迎提意见,可以随时更新. 源文件链接地址点此 图片如下: 多媒体插件如下:

  7. 【Netty】&lpar;4&rpar;—源码AbstractBootstrap

    源码AbstractBootstrap 一.概念 AbstractBootstrap是一个工具类,用于服务器通道的一系列配置,绑定NioEventLoopGroup线程组,指定指定NIO的模式,指定子 ...

  8. linux中文件多行合并为一行的例子

    现网中经常遇到匹配到某一关键字下的所有行合并到同一行,再次匹配到相关关键字再和下面的合并,示例如下: # line1ab# line2cde# line3f想要变成: # line1 a b# lin ...

  9. 关于面试总结3-SQL查询

    前言 select top n 形式的语句可以获取查询的前几个记录,但是 mysql没有此语法,mysql用limit来实现相关功能. LIMIT子句可以被用于强制 SELECT 语句返回指定的记录数 ...

  10. 四大组件之Service

    1 通过startService 1.1 与调用者相对独立,没有返回,用于播放音乐,下载文件 1.2 如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行.下次 ...