fhq treap
学了一下,好像明白了(背下来了)
不想写main函数了
PS:这个比treap好写(私以为)
#include<bits/stdc++.h>
using namespace std;
int tot,root;
struct treap{
int v,ch[2],rnd;
}t[N];
void split(int now,int k,int &x,int &y){//将now分为x,y两棵子树(可以为空)
if(!now){
x=y=0;
return;
}
if(t[now].val<=k)
x=now,split(t[now].ch[1],k,t[now].ch[1],y);//now即为左子树根,递归处理右子树,此时x的左子树为now分裂出的小于等于k的子树的左子树,还要找到其右子树,即为now右儿子分裂出的小于子树
else //即可解释上行的函数调用,修改了now的右子树
y=now,spilt(t[now].ch[0],k,x,t[now].ch[0]);
}
int merge(int x,int y){
if(!x||!y)return x+y;
update(x),update(y);
if(t[x].rnd<t[y].rnd){
t[x].ch[1]=merge(t[x].ch[1],y);
update(x);
return x;
}
else {
t[y].ch[0]=merge(x,t[y].ch[0]);
update(y);
return y;
}
}
int neww(int v){
t[++tot].size=1;
t[tot].val=v;
t[tot].rnd=rand();
return tot;
}
int kth(int now,int k)// 查询排名
{
while(1)
{
if(k<=t[t[now].ch[0]].size)
now=t[now].ch[0];// 在左子树中,且数量小于左子树的大小,迭代寻找
else if(k==t[t[now].ch[0]].size+1)
return now;// 找到了
else
k-=t[t[now].ch[0]].size+1,now=t[now].ch[1];// 去右子树找
}
}
/*插入v
split(root,v,x,y);
root=merge(merge(x,neww(v)),y);
*/
/*
split(root,v,a,b);
split(a,v-1,a,d);
d=merge(t[d].ch[0],t[d].ch[1]);这样写是因为可以不维护size(指元素数量)
root=merge(merge(a,d),b);
*/
/*查询rank
split(root,a-1,x,y);
printf("%d\n",t[x].size+1);
root=merge(x,y);
*/
/*查值
printf("%d\n",t[kth(root,a)].val);
*/
/*找前驱
split(root,a-1,x,y);
printf("%d\n",t[kth(x,siz[x])].val);
root=merge(x,y);
*/
/*找后继
split(root,a,x,y);
printf("%d\n",t[kth(y,1)].val);
root=merge(x,y);
*/
int main(){
return 0;
}
fhq treap的更多相关文章
- fhq treap最终模板
新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...
- NOI 2002 营业额统计 (splay or fhq treap)
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- 【POJ2761】【fhq treap】A Simple Problem with Integers
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- 【fhq Treap】bzoj1500(听说此题多码上几遍就能不惧任何平衡树题)
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 15112 Solved: 4996[Submit][Statu ...
- 「FHQ Treap」学习笔记
话说天下大事,就像fhq treap —— 分久必合,合久必分 简单讲一讲.非旋treap主要依靠分裂和合并来实现操作.(递归,不维护fa不维护cnt) 合并的前提是两棵树的权值满足一边的最大的比另一 ...
- FHQ Treap摘要
原理 以随机数维护平衡,使树高期望为logn级别 不依靠旋转,只有两个核心操作merge(合并)和split(拆分) 因此可持久化 先介绍变量 ; int n; struct Node { int v ...
- FHQ Treap小结(神级数据结构!)
首先说一下, 这个东西可以搞一切bst,treap,splay所能搞的东西 pre 今天心血来潮, 想搞一搞平衡树, 先百度了一下平衡树,发现正宗的平衡树写法应该是在二叉查找树的基础上加什么左左左右右 ...
- 在平衡树的海洋中畅游(四)——FHQ Treap
Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AV ...
- 浅谈fhq treap
一.简介 fhq treap 与一般的treap主要有3点不同 1.不用旋转 2.以merge和split为核心操作,通过它们的组合实现平衡树的所有操作 3.可以可持久化 二.核心操作 代码中val表 ...
- fhq treap 学习笔记
序 今天心血来潮,来学习一下fhq treap(其实原因是本校有个OIer名叫fh,当然不是我) 简介 fhq treap 学名好像是"非旋转式treap及可持久化"...听上去怪 ...
随机推荐
- html&css学习笔记----YJZJZQA
HTML表单: (
- [LeetCode] 22. 括号生成
题目链接:https://leetcode-cn.com/problems/generate-parentheses/ 题目描述: 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能 ...
- 利用node.js来实现长连接/聊天(通讯实例)
首先: 需要在服务器端安装node.js,然后安装express,socket.io这两个模块,并配置好相关的环境变量等. 其次: 服务端代码如下: var app = require('expres ...
- jdk8中的stream
https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/ Java 8 中的 Streams API 详解 Streams 的背景 ...
- Photoshop给草坡上的人物加上大气的霞光
<点小图查看大图> 最终效果 1.打开原图素材大图,创建可选颜色调整图层,对红色.黄色.黑色进行调整,参数设置如图1 - 3,效果如图4.这一步减少图片中的红色,并给暗部增加蓝色. < ...
- Ubuntu本地文件上传至HDFS文件系统出现的乱码问题及解决方案
1.问题来源及原因 用shell命令上传到HDFS中之后出现中文乱码,在shell命令窗口查看如图: 在eclipse中的文件HDFS查看工具查看如图: 原因:上传至HDFS文件系统的文本文件(这里是 ...
- MyBatis-Plus
一.通用SQL 1.简介:(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 2.定义Javabean中成员变量所使用的的类型: ...
- Bitmap的使用习惯——及时释放Bitmap占用的内存
当Bitmap不再需要使用时,我们应该回收它占用的内存,如果我们直接把指向bitmap的引用置null的话,这样bitmap还是会存在内存中,直到GC机制起作用时,才可能会把这个bitmap回收.这样 ...
- Event-Loop In JS
原文:最后一次搞懂 Event Loop 自打 ES 6 推出 Promise 改善了 js 的异步编程之后,eventloop 也越来越多地出现在视野当中.借用大佬们的话:“Event Loop 是 ...
- ie6下固定位置的实现
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...