二次联通门 : 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)相关推荐

  1. 带旋treap概念及模板,带例题:普通平衡树

    带旋Treap 二叉查找树BST(Binary Search Tree)定义 Treap定义 模板合集(均为O(logn)O(logn)O(logn)) push_up模板 旋转模板 插入模板 删除模 ...

  2. 【数据结构】平衡树 - treap

    treap = tree + heap 树堆(treap:让BST尽量随机) 动态维护一个有序序列 对于一个大根堆: 最大值:一直往右走 最小值:一直往左走 treap实现操作 set实现 ①插入 i ...

  3. 信息学奥赛一本通 提高篇 第6章 平衡树Treap

    随笔分类 - 动态规划--树形动态规划 动态规划--树形动态规划 - 随笔分类 - 符拉迪沃斯托克 - 博客园 平衡树 Treap 平衡树_百度百科 平衡树--treap - genius777 - ...

  4. 平衡树-Treap基础内容

    平衡树-Treap 2021年8月6日 什么是平衡树? 平衡树是指任意节点左右子树高度差都小于等于1的二叉树. 平衡树干什么? 平衡树对序列的排序,寻找元素的位置有很方便的操作 算法原理 建树 Tre ...

  5. [学习笔记] 伸展树splay详解+全套模板+例题[Luogu P3369 【模板】普通平衡树]

    文章目录 引入概念 全套模板 变量声明 update ==rotate旋转== splay操作 insert插入 delete删除 查找x的位置 查找第k大 前驱/后继 极小值-inf和极大值inf的 ...

  6. 2019 ICPC 南昌 K. Tree(树上启发式合并,平衡树 treap)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://nanti.jisuanke.com/t/42586 Problem 给定一 ...

  7. 【洛谷P3369】 (模板)普通平衡树

    https://www.luogu.org/problemnew/show/P3369 Splay模板 1 #include<iostream> 2 #include<cstdio& ...

  8. 平衡树 - treap

    整理的算法模板合集: ACM模板 operator 1 : 插入一个数 operator 2 : 删除一个数 operator 3 : 通过数值找排名 operator 4 : 通过排名找数值 ope ...

  9. BZOJ 3224: Tyvj 1728 普通平衡树 treap

    3224: Tyvj 1728 普通平衡树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

最新文章

  1. nagios配置文档
  2. 防火墙规则配置iptables
  3. docker 容器监控_以简便的方式监控Docker容器中的ADF应用程序
  4. Python3实现翻转二叉树问题
  5. 那些年踩过的Java异常,简直了!
  6. Visualbox中linux的网络配置
  7. qt 子窗口与父窗口数据通信_Qt实例--主窗口和子窗口互发信号
  8. RFID 芯片是什么
  9. 为什么云开发最终将成为编程新标准?
  10. 第9章 SportsStorePeta 完成购物车
  11. AWS 吹走了私有云天空中最后一片乌云
  12. 学习浙江大学Photoshop设计精讲精练过程中的重难点及内容收获
  13. 《设计模式》(博客园精华集)
  14. 基于云开发的校园社区小程序 微信小程序开发实战 课设作业
  15. oracle中sql的递归查询运用
  16. 脏写、脏读、不可重复读、幻读的区别
  17. 关于谷歌浏览器崩溃,打不开页面
  18. LightGBM详细
  19. word文字 分列插入execl
  20. java基础(含JUC):论后端工程师的个人修为

热门文章

  1. android:installLocation简析
  2. Flink SQL Client注册JAVA UDF完整流程
  3. pandas的DataFrame转化为Datatable的DataFrame
  4. cairo-clock设置为自动启动后总是自动变为default主题
  5. keras版本 str object has no attribute decode
  6. Qt 中使用dll文件的舒服用法 generateDocumentation()函数 乱码解决
  7. 微力同步linux,云端同步软件-微力同步下载 v2.4.3 官方版 - 下载吧
  8. kill命令---Linux学习笔记
  9. DWR的使用以及DWR中工具JS文件的使用
  10. iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架