学了一下,好像明白了(背下来了)

不想写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的更多相关文章

  1. fhq treap最终模板

    新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...

  2. NOI 2002 营业额统计 (splay or fhq treap)

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

  3. 【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 ...

  4. 【fhq Treap】bzoj1500(听说此题多码上几遍就能不惧任何平衡树题)

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 15112  Solved: 4996[Submit][Statu ...

  5. 「FHQ Treap」学习笔记

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

  6. FHQ Treap摘要

    原理 以随机数维护平衡,使树高期望为logn级别 不依靠旋转,只有两个核心操作merge(合并)和split(拆分) 因此可持久化 先介绍变量 ; int n; struct Node { int v ...

  7. FHQ Treap小结(神级数据结构!)

    首先说一下, 这个东西可以搞一切bst,treap,splay所能搞的东西 pre 今天心血来潮, 想搞一搞平衡树, 先百度了一下平衡树,发现正宗的平衡树写法应该是在二叉查找树的基础上加什么左左左右右 ...

  8. 在平衡树的海洋中畅游(四)——FHQ Treap

    Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AV ...

  9. 浅谈fhq treap

    一.简介 fhq treap 与一般的treap主要有3点不同 1.不用旋转 2.以merge和split为核心操作,通过它们的组合实现平衡树的所有操作 3.可以可持久化 二.核心操作 代码中val表 ...

  10. fhq treap 学习笔记

    序 今天心血来潮,来学习一下fhq treap(其实原因是本校有个OIer名叫fh,当然不是我) 简介 fhq treap 学名好像是"非旋转式treap及可持久化"...听上去怪 ...

随机推荐

  1. day 24 面向对象之继承及属性查找顺序

    组合 组合:自定义类的对象作为另外一个类的属性 class Teacher: def init(self, name, age): self.name = name self.age = age t1 ...

  2. openstack第二章:glance

    第二篇glance— 镜像服务 一.glance介绍:              Glance是Openstack项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找.注册和检索等. Glance提供 ...

  3. An interesting combinational problem

    A question of details in the solution at the end of this post of the question is asked by me at MSE. ...

  4. leetcode 678. Valid Parenthesis String

    678. Valid Parenthesis String Medium Given a string containing only three types of characters: '(', ...

  5. 关于spring boot中 EmbeddedServletContainerCustomizer

    EmbeddedServletContainerCustomizer这个在spring boot2.X的版本中就不再提供支持了貌似2.0版本还能用 ,用来提供对异常的处理.在支持EmbeddedSer ...

  6. C# 如何使用配置文件保存应用程序里的配置数据

    引言 我不知大家早先是如何保存应用程序配置,以备下次打开时使用的,反正我开始学.Net的时候就去研究序列化,以二进制或XML格式的序列化来保存应用程序配置.这样每次都要建立单独的配置类,并书写读写配置 ...

  7. 解决win环境下访问本机虚拟机中centos7 ftp服务器的问题

    inux搭建ftp服务器 1.安装软件: yum install vsftpd 2.修改配置文件vsftpd.conf: vim /etc/vsftpd/vsftpd.conf 把anonymous_ ...

  8. vue中watch检测到不到对象属性的变化的解决方法

    watch: { option: { handler(newVal) { console.log(newVal); }, deep: true, immediate: true } }, 需要深层wa ...

  9. WebSocket原理

    一 . WebSocket原理 1.1.背景 WebSocket 是基于Http 协议的改进,Http 为无状态协议,基于短连接,需要频繁的发起请求,第二 Http 只能客户端发起请求,服务端无法主动 ...

  10. 【转】xargs命令详解,xargs与管道的区别

    为什么要用xargs,问题的来源 在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以 ...