等我写完。

普通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树学习笔记的更多相关文章

  1. zkw线段树学习笔记

    zkw线段树学习笔记 今天模拟赛线段树被卡常了,由于我自带常数 \(buff\),所以学了下zkw线段树. 平常的线段树无论是修改还是查询,都是从根开始递归找到区间的,而zkw线段树直接从叶子结点开始 ...

  2. 仙人掌&圆方树学习笔记

    仙人掌&圆方树学习笔记 1.仙人掌 圆方树用来干啥? --处理仙人掌的问题. 仙人掌是啥? (图片来自于\(BZOJ1023\)) --也就是任意一条边只会出现在一个环里面. 当然,如果你的图 ...

  3. 线段树学习笔记(基础&进阶)(一) | P3372 【模板】线段树 1 题解

    什么是线段树 线段树是一棵二叉树,每个结点存储需维护的信息,一般用于处理区间最值.区间和等问题. 线段树的用处 对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是 O(log n). 基础 ...

  4. Treap-平衡树学习笔记

    平衡树-Treap学习笔记 最近刚学了Treap 发现这种数据结构真的是--妙啊妙啊~~ 咳咳.... 所以发一发博客,也是为了加深蒟蒻自己的理解 顺便帮助一下各位小伙伴们 切入正题 Treap的结构 ...

  5. JSOI2008 Blue Mary开公司 | 李超线段树学习笔记

    题目链接:戳我 这相当于是一个李超线段树的模板qwqwq,题解就不多说了. 代码如下: #include<iostream> #include<cstdio> #include ...

  6. 树堆(Treap)学习笔记 2020.8.12

    如果一棵二叉排序树的节点插入的顺序是随机的,那么这样建立的二叉排序树在大多数情况下是平衡的,可以证明,其高度期望值为 \(O( \log_2 n )\).即使存在一些极端情况,但是这种情况发生的概率很 ...

  7. [普通平衡树treap]【学习笔记】

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9046  Solved: 3840[Submit][Sta ...

  8. Splay伸展树学习笔记

    Splay伸展树 有篇Splay入门必看文章 —— CSDN链接 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 创造者:Daniel Sleator 和 Robert Ta ...

  9. CART分类与回归树 学习笔记

    CART:Classification and regression tree,分类与回归树.(是二叉树) CART是决策树的一种,主要由特征选择,树的生成和剪枝三部分组成.它主要用来处理分类和回归问 ...

  10. 「FHQ Treap」学习笔记

    话说天下大事,就像fhq treap —— 分久必合,合久必分 简单讲一讲.非旋treap主要依靠分裂和合并来实现操作.(递归,不维护fa不维护cnt) 合并的前提是两棵树的权值满足一边的最大的比另一 ...

随机推荐

  1. 基于C# 开发的SOL SERVER 操作数据库类(SQLHelp)

    说明:以下是我近两年年来开发中最常用的C#操作sql server数据库访问类,对初学者非常有用,容易扩展,支持多库操作,多研究研究,有什么问题欢迎留言 当前环境为 C#  .NET CORE 3.0 ...

  2. Python Django 零基础从零到一部署服务,Hello Django!全文件夹目录和核心代码!

    在这篇文章中,我将手把手地教你如何从零开始部署一个使用Django框架的Python服务.无论你是一个刚开始接触开发的新手,还是一个有经验的开发者想要快速了解Django,这篇教程都会为你提供一条清晰 ...

  3. 创建属于自己的github、使用git提交、更新代码至github、写好readme

    1. 在github上创建一个Repository 点击github网站,你可以用你的邮箱先注册一个账号. 点击New,转到创建一个repository的界面,如下图所示,你可以填写你的Reposit ...

  4. maven报错:不再支持源选项 5。请使用 6 或更高版本

    问题描述 在执行命令 mvn compile 发生错误 D:\Github_NOTES\JavaWeb_Learning\02Java\JavaWeb\Code\Maven1>mvn clean ...

  5. vue报错解决Duplicate keys detected: ‘[object Object]’

    最近在做vue项目时遇到了报错 ​ Duplicate keys detected: '[object Object]'. This may cause an update error. ​ 由于这个 ...

  6. 【阅读笔记】超分之LANR-NLM算法

    论文信息 [Single Image Super-Resolution via Locally Regularized Anchored Neighborhood Regression and Non ...

  7. 在HTML中引入React和JSX

    前言 Vue 可以非常方便地与 Pure HTML 结合,代替 jQuery 的功能,有一次遇到类似的场景时,我就想 React 能不能也以这种方式接入 HTML 网页,从而提高开发效率. 结果当然是 ...

  8. MapReduce实现TopN的效果

    1.背景 最近在学习Hadoop的MapReduce,此处记录一下如何实现 TopN 的效果,以及在MapReduce中如何实现 自定义分组. 2.需求 我们有一份数据,数据中存在如下3个字段,订单编 ...

  9. pip安装pyinstaller失败的解决方法

    错误情况: 从下面错误来看,是安装build的依赖失败 解决方法: 下载setup.py文件来安装 1.先下载 pyinstaller的安装文件,下载地址:http://www.pyinstaller ...

  10. chrome浏览器中使用adblockplus拦截广告

    adblock plus是一款可以屏蔽广告以及任何你想屏蔽元素的软件,屏蔽之后的效果如下图所示,abp自动屏蔽广告,还可以自行添加屏蔽内容,右上角红色的ABP标识就是该软件     下载地址: htt ...