fhq treap ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : LibreOJ #104. 普通平衡树
#include <cstdio> #include <iostream> #include <algorithm> const int BUF = 12312323; char Buf[BUF], *buf = Buf;inline void read (int &now) {bool temp = false;for (now = 0; !isdigit (*buf); ++ buf)if (*buf == '-') temp = true;for (; isdigit (*buf); now = now *10 + *buf - '0', ++ buf);if (temp) now = -now; }struct T_D {T_D *L, *R;int key, r, s;inline void Updata (){s = 1 + (L ? L->s : 0) + (R ? R->s : 0);} };#define Max 1231231 struct D { T_D *x, *y; D () {}D (T_D *_x, T_D *_y) : x (_x), y (_y) {} }; class Fhq_Treap {private :T_D poor[Max], *Ta, *Root;inline T_D *New (int _x){T_D *now = ++ Ta;now->r = rand (), now->key = _x;now->s = 1, now->L = now->R = NULL;return now; }D Split (T_D *now, int k){if (now == NULL) return D (NULL, NULL);D res;if ((now->L ? now->L->s : 0) >= k){res = Split (now->L, k);now->L = res.y, now->Updata ();res.y = now;}else{res = Split (now->R, k - (now->L ? now->L->s : 0) - 1);now->R = res.x, now->Updata ();res.x = now;}return res;}T_D *Merge (T_D *A, T_D *B){if (A == NULL) return B;if (B == NULL) return A;if (A->r < B->r){A->R = Merge (A->R, B);A->Updata (); return A;}else {B->L = Merge (A, B->L); B->Updata (); return B;}}int Get_rank (T_D *now, int k){if (now == NULL) return 0;return k <= now->key ? Get_rank (now->L, k) : (Get_rank (now->R, k) + (now->L ? now->L->s : 0) + 1);}public :Fhq_Treap () { Ta = poor; }inline int Get_rank (int k){return Get_rank (Root, k) + 1;}int Find_kth (int k){D x = Split (Root, k - 1);D y = Split (x.y, 1);T_D *res = y.x;Root = Merge (Merge (x.x, res), y.y);return res->key;}void Insert (int key){int k = Get_rank (Root, key);D x = Split (Root, k);T_D *now = New (key);Root = Merge (Merge (x.x, now), x.y);}void Delete (int key){int k = Get_rank (Root, key);D x = Split (Root, k);D y = Split (x.y, 1);Root = Merge (x.x, y.y);}int Find_Pre (int key){int k = Get_rank (Root, key);D x = Split (Root, k - 1);D y = Split (x.y, 1);T_D *res = y.x;Root = Merge (Merge (x.x, res), y.y);return res->key;}int Find_Suc (int key){int k = Get_rank (Root, key + 1);D x = Split (Root, k);D y = Split (x.y, 1);T_D *res = y.x;Root = Merge (Merge (x.x, res), y.y);return res->key;} };Fhq_Treap Tree; int Main () {fread (buf, 1, BUF, stdin);int N, M; register int i;read (N); int x, type;for (i = 1; i <= N; ++ i){read (type), read (x);if (type == 1)Tree.Insert (x);else if (type == 2)Tree.Delete (x);else if (type == 3)printf ("%d\n", Tree.Get_rank (x));else if (type == 4)printf ("%d\n", Tree.Find_kth (x));else if (type == 5)printf ("%d\n", Tree.Find_Pre (x));else printf ("%d\n", Tree.Find_Suc (x));}return 0; }int ZlycerQan = Main (); int main (int argc, char *argv[]) {;}
转载于:https://www.cnblogs.com/ZlycerQan/p/7426656.html
fhq treap ------ luogu P3369 【模板】普通平衡树(Treap/SBT)相关推荐
- 带旋treap概念及模板,带例题:普通平衡树
带旋Treap 二叉查找树BST(Binary Search Tree)定义 Treap定义 模板合集(均为O(logn)O(logn)O(logn)) push_up模板 旋转模板 插入模板 删除模 ...
- 【数据结构】平衡树 - treap
treap = tree + heap 树堆(treap:让BST尽量随机) 动态维护一个有序序列 对于一个大根堆: 最大值:一直往右走 最小值:一直往左走 treap实现操作 set实现 ①插入 i ...
- 信息学奥赛一本通 提高篇 第6章 平衡树Treap
随笔分类 - 动态规划--树形动态规划 动态规划--树形动态规划 - 随笔分类 - 符拉迪沃斯托克 - 博客园 平衡树 Treap 平衡树_百度百科 平衡树--treap - genius777 - ...
- 平衡树-Treap基础内容
平衡树-Treap 2021年8月6日 什么是平衡树? 平衡树是指任意节点左右子树高度差都小于等于1的二叉树. 平衡树干什么? 平衡树对序列的排序,寻找元素的位置有很方便的操作 算法原理 建树 Tre ...
- [学习笔记] 伸展树splay详解+全套模板+例题[Luogu P3369 【模板】普通平衡树]
文章目录 引入概念 全套模板 变量声明 update ==rotate旋转== splay操作 insert插入 delete删除 查找x的位置 查找第k大 前驱/后继 极小值-inf和极大值inf的 ...
- 2019 ICPC 南昌 K. Tree(树上启发式合并,平衡树 treap)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://nanti.jisuanke.com/t/42586 Problem 给定一 ...
- 【洛谷P3369】 (模板)普通平衡树
https://www.luogu.org/problemnew/show/P3369 Splay模板 1 #include<iostream> 2 #include<cstdio& ...
- 平衡树 - treap
整理的算法模板合集: ACM模板 operator 1 : 插入一个数 operator 2 : 删除一个数 operator 3 : 通过数值找排名 operator 4 : 通过排名找数值 ope ...
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
最新文章
- nagios配置文档
- 防火墙规则配置iptables
- docker 容器监控_以简便的方式监控Docker容器中的ADF应用程序
- Python3实现翻转二叉树问题
- 那些年踩过的Java异常,简直了!
- Visualbox中linux的网络配置
- qt 子窗口与父窗口数据通信_Qt实例--主窗口和子窗口互发信号
- RFID 芯片是什么
- 为什么云开发最终将成为编程新标准?
- 第9章 SportsStorePeta 完成购物车
- AWS 吹走了私有云天空中最后一片乌云
- 学习浙江大学Photoshop设计精讲精练过程中的重难点及内容收获
- 《设计模式》(博客园精华集)
- 基于云开发的校园社区小程序 微信小程序开发实战 课设作业
- oracle中sql的递归查询运用
- 脏写、脏读、不可重复读、幻读的区别
- 关于谷歌浏览器崩溃,打不开页面
- LightGBM详细
- word文字 分列插入execl
- java基础(含JUC):论后端工程师的个人修为
热门文章
- android:installLocation简析
- Flink SQL Client注册JAVA UDF完整流程
- pandas的DataFrame转化为Datatable的DataFrame
- cairo-clock设置为自动启动后总是自动变为default主题
- keras版本 str object has no attribute decode
- Qt 中使用dll文件的舒服用法 generateDocumentation()函数 乱码解决
- 微力同步linux,云端同步软件-微力同步下载 v2.4.3 官方版 - 下载吧
- kill命令---Linux学习笔记
- DWR的使用以及DWR中工具JS文件的使用
- iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架