Treap树学习笔记
等我写完。
普通fhq treap:
enum {
Maxn = 1000005
}; struct FHQTreap {
int lson[Maxn], rson[Maxn], data[Maxn];
int rnd[Maxn], sze[Maxn], root, tot, seed;
FHQTreap(void) {
Ms(lson, 0), Ms(rson, 0), Ms(data, 0);
Ms(rnd, 0), Ms(sze, 0), root = tot = 0, seed = 1;
} inline int _rand(void) { return seed *= 482711; }
inline void pushup(int pos) { sze[pos] = sze[lson[pos]] + sze[rson[pos]] + 1; }
inline void split(int pos, int val, int &x, int &y) {
if (!pos) { x = y = 0; return; }
if (data[pos] <= val) x = pos, split(rson[pos], val, rson[pos], y);
else y = pos, split(lson[pos], val, x, lson[pos]); pushup(pos);
} inline int merge(int x, int y) {
if (!x || !y) return x + y;
if (rnd[x] < rnd[y]) return rson[x] = merge(rson[x], y), pushup(x), x;
else return lson[y] = merge(x, lson[y]), pushup(y), y;
} inline void insert(int val) {
int x, y, pos = ++tot;
data[pos] = val, sze[pos] = 1, rnd[pos] = _rand();
split(root, val, x, y);
root = merge(merge(x, pos), y);
} inline void remove(int val) {
int x, y, z;
split(root, val - 1, x, y);
split(y, val, y, z); if (!y) return;
y = merge(lson[y], rson[y]);
root = merge(x, merge(y, z));
} inline int query_rank(int val) {
int x, y, ret;
split(root, val - 1, x, y);
ret = sze[x] + 1; root = merge(x, y);
return ret;
} inline int select(int kth) {
int pos = root;
while (kth != sze[lson[pos]] + 1)
if (kth <= sze[lson[pos]]) pos = lson[pos];
else kth -= sze[lson[pos]] + 1, pos = rson[pos];
return data[pos];
} inline int pred(int val) { return select(query_rank(val) - 1); }
inline int succ(int val) { return select(query_rank(val + 1)); }
} treap;
这时候,我们会很容易想到使用lower_bound进行优化:
# include <bits/stdc++.h>
# define int long long
using namespace std;
int ans;
struct STL_Treap{
vector<int>a;
void insert(int x) { a.insert(lower_bound(a.begin(),a.end(),x),x);}
void erase(int x) {a.erase(lower_bound(a.begin(),a.end(),x));}
int rank(int x) {return lower_bound(a.begin(),a.end(),x)-a.begin()+1;}
int kth(int x){return a[x-1];}
int pre(int x) {return *(--lower_bound(a.begin(),a.end(),x));}
int nxt(int x){return *upper_bound(a.begin(),a.end(),x);}
}treap;
signed main()
{
scanf("%lld",&ans);
for (int i=1;i<=ans;i++) {
int a,b;
scanf("%lld%lld",&a,&b);
switch (a) {
case 1ll:treap.insert(b);break;
case 2ll:treap.erase(b);break;
case 3ll:cout<<treap.rank(b)<<'\n';break;
case 4ll:cout<<treap.kth(b)<<'\n';break;
case 5ll:cout<<treap.pre(b)<<'\n';break;
case 6ll:cout<<treap.nxt(b)<<'\n';break;
}
}
return 0;
}
https://www.luogu.com.cn/problem/P3369(普通平衡树)
相当优美了属于是。
Treap树学习笔记的更多相关文章
- zkw线段树学习笔记
zkw线段树学习笔记 今天模拟赛线段树被卡常了,由于我自带常数 \(buff\),所以学了下zkw线段树. 平常的线段树无论是修改还是查询,都是从根开始递归找到区间的,而zkw线段树直接从叶子结点开始 ...
- 仙人掌&圆方树学习笔记
仙人掌&圆方树学习笔记 1.仙人掌 圆方树用来干啥? --处理仙人掌的问题. 仙人掌是啥? (图片来自于\(BZOJ1023\)) --也就是任意一条边只会出现在一个环里面. 当然,如果你的图 ...
- 线段树学习笔记(基础&进阶)(一) | P3372 【模板】线段树 1 题解
什么是线段树 线段树是一棵二叉树,每个结点存储需维护的信息,一般用于处理区间最值.区间和等问题. 线段树的用处 对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是 O(log n). 基础 ...
- Treap-平衡树学习笔记
平衡树-Treap学习笔记 最近刚学了Treap 发现这种数据结构真的是--妙啊妙啊~~ 咳咳.... 所以发一发博客,也是为了加深蒟蒻自己的理解 顺便帮助一下各位小伙伴们 切入正题 Treap的结构 ...
- JSOI2008 Blue Mary开公司 | 李超线段树学习笔记
题目链接:戳我 这相当于是一个李超线段树的模板qwqwq,题解就不多说了. 代码如下: #include<iostream> #include<cstdio> #include ...
- 树堆(Treap)学习笔记 2020.8.12
如果一棵二叉排序树的节点插入的顺序是随机的,那么这样建立的二叉排序树在大多数情况下是平衡的,可以证明,其高度期望值为 \(O( \log_2 n )\).即使存在一些极端情况,但是这种情况发生的概率很 ...
- [普通平衡树treap]【学习笔记】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9046 Solved: 3840[Submit][Sta ...
- Splay伸展树学习笔记
Splay伸展树 有篇Splay入门必看文章 —— CSDN链接 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 创造者:Daniel Sleator 和 Robert Ta ...
- CART分类与回归树 学习笔记
CART:Classification and regression tree,分类与回归树.(是二叉树) CART是决策树的一种,主要由特征选择,树的生成和剪枝三部分组成.它主要用来处理分类和回归问 ...
- 「FHQ Treap」学习笔记
话说天下大事,就像fhq treap —— 分久必合,合久必分 简单讲一讲.非旋treap主要依靠分裂和合并来实现操作.(递归,不维护fa不维护cnt) 合并的前提是两棵树的权值满足一边的最大的比另一 ...
随机推荐
- asp登录认证,记录最后一次登录时间,写入数据库代码
最近开发了一个船员招聘网的程序,但是由于部分功能需要配合ASP代码才能使用,所以就发现以前写的这个asp登录认证代码,今天就将他公布一下. <!--#include file="con ...
- Apache Hudi 元数据字段揭秘
介绍 Apache Hudi 最初由Uber于 2016 年开发,旨在实现一个交易型数据湖,该数据湖可以快速可靠地支持更新,以支持公司拼车平台的大规模增长. Apache Hudi 现在被业内许多人广 ...
- 记一次 .NET 某医院预约平台 非托管泄露分析
一:背景 1. 讲故事 前几天有位朋友找到我,说他的程序有内存泄露,让我帮忙排查一下,截图如下: 说实话看到 32bit, 1.5G 这些关键词之后,职业敏感告诉我,他这个可能是虚拟地址紧张所致,不管 ...
- NSSCTF-[羊城杯 2021]签到题
(脑洞题 gif放在stegsolve,分离gif 大胆猜测! 图一 28准则 图二 太极八卦阵 8 图三 三十而立 30 图四 北斗七星 7 图五 四个人 4大才子 图六 这个是歼-20 图七 两只 ...
- Python数据分析易错知识点归纳(四):Matplotlib
四.matplotlib 基本特性 import matplotlib.pyplot as plt import numpy as np x = np.linspace(-3, 3, 50) y1 = ...
- Linux实现双击自动安装deb文件
在Linux中,有几个常用的软件可以实现双击自动安装.deb文件的功能.以下是一些推荐的软件: 1. GDebi:GDebi是一个轻量级的图形化工具,专门用于安装.deb文件.它可以解决依赖关系,并提 ...
- 并发编程-FutureTask解析
1.FutureTask对象介绍 Future对象大家都不陌生,是JDK1.5提供的接口,是用来以阻塞的方式获取线程异步执行完的结果. 在Java中想要通过线程执行一个任务,离不开Runnable与C ...
- 【分享】如何才能简洁高效不失优雅的爆破ZIP文件?
0x01 前言 在CTF比赛中,压缩包密码的爆破一直是一个热门话题.在这个过程中,简洁高效的方法是至关重要的.本文将介绍一些实用的技巧和工具,帮助您高效地爆破ZIP文件密码,而不失优雅.我们将探讨一些 ...
- 《CTFshow-Web入门》01. Web 1~10
@ 目录 web1 题解 web2 题解 web3 题解 web4 题解 web5 题解 原理 web6 题解 原理 web7 题解 web8 题解 web9 题解 原理 web10 题解 ctf - ...
- 使用 SQL 的方式查询消息队列数据以及踩坑指南
背景 为了让业务团队可以更好的跟踪自己消息的生产和消费状态,需要一个类似于表格视图的消息列表,用户可以直观的看到发送的消息:同时点击详情后也能查到消息的整个轨迹. 消息列表 点击详情后查看轨迹 原理介 ...