#include <memory>//智能指针头文件
#include <random>//随机数头文件
#include <iostream>
#include <algorithm>
#include <ctime>//time头文件 template<class T>
struct node
{
T key;
unsigned weight;
std::shared_ptr<node<T>> lchild, rchild, parent;
node(T key, unsigned weight, std::shared_ptr<node<T>> lchild = nullptr,
std::shared_ptr<node<T>> rchild = nullptr, std::shared_ptr<node<T>> parent = nullptr):
key(key)
{
this->weight = weight;
this->lchild = lchild;
this->rchild = rchild;
this->parent = parent;
}
}; template<class T>
class Treap
{
private:
std::shared_ptr<node<T>> root;
std::default_random_engine generator;
std::uniform_int_distribution<int> dis;
void left_rotation(std::shared_ptr<node<T>> a)
{
if (a == nullptr) return; std::shared_ptr<node<T>> b = a->lchild;
if (b == nullptr) return; if (b->rchild != nullptr)
{
a->lchild = b->rchild;
b->rchild->parent = a;
}
else
a->lchild = nullptr;// b->parent = a->parent;
if (a->parent == nullptr)
root = b;
else
{
if (a->parent->lchild == a)
a->parent->lchild = b;
else
a->parent->rchild = b;
} b->rchild = a;
a->parent = b;
}
void right_rotation(std::shared_ptr<node<T>> a)
{
if (a == nullptr) return; std::shared_ptr<node<T>> b = a->rchild;
if (b == nullptr) return; if (b->lchild != nullptr)
{
a->rchild = b->lchild;
b->lchild->parent = a;
}
else
a->rchild = nullptr; b->parent = a->parent;
if (a->parent == nullptr)
root = b;
else
{
if (a->parent->lchild == a)
a->parent->lchild = b;
else
a->parent->rchild = b;
} b->lchild = a;
a->parent = b;
}
public:
Treap() :generator(time(nullptr)), dis(, )
{
root = nullptr;
}
void insert(T key)
{
std::shared_ptr<node<T>> tmp = std::make_shared<node<T>>(key, dis(generator));
std::shared_ptr<node<T>> ptr = root;
if (ptr == nullptr)
{
root = tmp;
return;
} while (true)
{
if (key <= ptr->key)
{
if (ptr->lchild == nullptr) break;
ptr = ptr->lchild;
}
else
{
if (ptr->rchild == nullptr) break;
ptr = ptr->rchild;
}
} if (key <= ptr->key)
ptr->lchild = tmp;
else
ptr->rchild = tmp;
tmp->parent = ptr; while (ptr != nullptr)
{
if (tmp->weight < ptr->weight)
{
if (ptr->lchild == tmp)
{
left_rotation(ptr);
ptr = tmp->parent;
}
else
{
right_rotation(ptr);
ptr = tmp->parent;
}
}
else
break;
}
}
void earse(T key)
{
std::shared_ptr<node<T>> ptr = root;
while (ptr != nullptr)
{
if (key == ptr->key)
break;
else if (key < ptr->key)
ptr = ptr->lchild;
else
ptr = ptr->rchild;
}
if (ptr == nullptr) return;
while (true)
{
if (ptr->lchild == nullptr || ptr->rchild == nullptr)
{
if (ptr->lchild == nullptr && ptr->rchild == nullptr)
{
if (ptr->parent == nullptr) root = nullptr;
else
{
if (ptr->parent->lchild == ptr)
ptr->parent->lchild = nullptr;
else
ptr->parent->rchild = nullptr;
}
}
else if (ptr->lchild == nullptr)
{
if (ptr->parent == nullptr)
root = ptr->rchild;
else
{
if (ptr->parent->lchild == ptr)
ptr->parent->lchild = ptr->rchild;
else
ptr->parent->rchild = ptr->rchild;
}
ptr->rchild->parent = ptr->parent;
}
else
{
if (ptr->parent == nullptr)
root = ptr->lchild;
else
{
if (ptr->parent->lchild == ptr)
ptr->parent->lchild = ptr->lchild;
else
ptr->parent->rchild = ptr->lchild;
}
ptr->lchild->parent = ptr->parent;
}
return;
}
else
{
if (ptr->lchild->weight <= ptr->rchild->weight)
left_rotation(ptr);
else
right_rotation(ptr);
}
}
}
};

平衡数之Treap的更多相关文章

  1. hdu 3709 Balanced Number(平衡数)--数位dp

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  2. SPOJ BALNUM Balanced Numbers 平衡数(数位DP,状压)

    题意: 平衡树定义为“一个整数的某个数位若是奇数,则该奇数必定出现偶数次:偶数位则必须出现奇数次”,比如 222,数位为偶数2,共出现3次,是奇数次,所以合法.给一个区间[L,R],问有多少个平衡数? ...

  3. hdu3709 (平衡数) 数位DP

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  4. 简析平衡树(二)——Treap

    前言 学完了替罪羊树,我决定再去学一学\(Treap\).一直听说\(Treap\)很难,我也花了挺久才学会. 简介 \(Treap\)这个名字真的挺有内涵: \(\color{red}{Tree}\ ...

  5. 「算法笔记」旋转 Treap

    一.引入 随机数据中,BST 一次操作的期望复杂度为 \(\mathcal{O}(\log n)\). 然而,BST 很容易退化,例如在 BST 中一次插入一个有序序列,将会得到一条链,平均每次操作的 ...

  6. c++ FHQ Treap

    前面我们对平衡树有了个大概的了解 关于 Treap Treap=Binary Search Tree + Heap 二叉搜索树 + 二叉堆(一般是小根堆) Treap 每一个节点有两个值 一个值是平衡 ...

  7. bzoj1691[Usaco2007 Dec]挑剔的美食家 平衡树treap

    Description 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返了.现在,Farmer John不得不去牧草专供商那里 ...

  8. FHQ Treap及其可持久化与朝鲜树式重构

    FHQ Treap,又称无旋treap,一种不基于旋转机制的平衡树,可支持所有有旋treap.splay等能支持的操作(只有在LCT中会比splay复杂度多一个log).最重要的是,它是OI中唯一一种 ...

  9. HDU 3709 Balanced Number 求区间内的满足是否平衡的数量 (数位dp)

    平衡数的定义是指,以某位作为支点,此位的左面(数字 * 距离)之和 与右边相等,距离是指某位到支点的距离; 题意:求区间内满足平衡数的数量 : 分析:很好这又是常见的数位dp , 不过不同的是我们这次 ...

随机推荐

  1. Perl模块利用CPAN在线安装自动化

    需要解决2个问题: 1.  如何与CPAN交互:利用perl –MCPAN –e ‘install 模块’ 2.  如何安装指定的版本:作者/模块-版本.tar.gz How to install a ...

  2. AWK的介绍学习

    第一节.awk的工作流程和基本用法 1.awk介绍 awk是一种报表生成器,就是对文件进行格式化处理的,这里的格式化不是文件系统的格式化,而是对文件内容进行各种"排版",进而格式化 ...

  3. AWK行处理的用法实例

    第一节 awk的工作流程及基础用法 awk操作符会先检索文件的行信息,然后在行信息里找需要的内容. Awk的默认分割付是空格,awk '/模式/{print $1,$2}' file ##模式的位置可 ...

  4. ubuntu 安装Gremlin 的图形化环境

    参考文档:https://www.jianshu.com/p/618cf6667381 部署HugeGraphServer # 直接下载release包 网址:https://github.com/h ...

  5. 使用GitHub+Hexo建立个人网站,并绑定自己的域名(Ubuntu环境下)

    参考链接: youngzn.github.io     hexo官网     博客:从jekyll到hexo    hexo建站小结  全过程  简洁过程 使用GitHub+Hexo建立个人网站,并绑 ...

  6. 洛谷——P3368 【模板】树状数组 2

    https://www.luogu.org/problem/show?pid=3368 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入 ...

  7. 《TCP/IP具体解释》读书笔记(19章)-TCP的交互数据流

    在TCP进行传输数据时.能够分为成块数据流和交互数据流两种.假设按字节计算.成块数据与交互数据的比例约为90%和10%,TCP须要同一时候处理这两类数据,且处理的算法不同. 书籍本章中以Rlogin应 ...

  8. C++学习笔记11-面向对象2

     1.  仅仅能初始化直接基类 一个类仅仅能初始化自己的直接基类.直接就是在派生列表中指定的类.假设类C 从类B 派生,类B 从类A 派生,则B 是C 的直接基类.尽管每一个C 类对象包括一个A 类部 ...

  9. JS学习十七天----工厂方法模式

    工厂方法模式 前言 今天自己看了一下自己写的部分博客,发现写的好丑....開始注意自己的排版!!可是偏亮也不是一朝一夕就完毕的,我尽量让它美丽一点.....每天美丽一点点 正文 工厂方法模式是一种实现 ...

  10. Hadoop的多节点集群详细启动步骤(3或5节点)

    版本1 利用自己写的脚本来启动,见如下博客 hadoop-2.6.0-cdh5.4.5.tar.gz(CDH)的3节点集群搭建 hadoop-2.6.0.tar.gz的集群搭建(3节点) hadoop ...