Treap

treap代码实现 void Insert(Node * &o,int x){//0为左子树,1为右子树 if(o==NULL){o = new Node(); o->ch[0]=o->ch[1]=NULL;o->key=x;o->weight=rand();} else{ int d=o->cmp(x); Insert(o->ch[d],x); if(o->ch[d]->weight>o->weight) rotate(o,d^1); } } 立即下载

POJ - 3481
警告:千万不要初始化种子,这oj会RE被坑了一天QAQ。
Treap就是一个用随机数优化了的二叉搜索树,二叉搜索树满足某个节点的值大于等于左儿子节点的值,小于右儿子节点的值,但是这样插入的值就会有可能形成一条链造成很低的效率,所以采用了用随机数优化的方法,随机的给每一个节点赋予一个优先级,在插入节点时,节点的优先级满足堆的性质(小顶堆或大顶堆),值满足二叉搜索树的性质,这就是一颗Treap。

为了满足上述的两个性质,在每次插入的时候都要对节点进行旋转操作,因为每次插入的时候都是直接插到叶子节点的,所以每次递归回去的时候就要进行旋转操作,以让Treap满足堆的性质。旋转操作是不会改变Treap的中序遍历的结果的,也就是说不会破坏二叉搜索树的性质,而且可以让Treap满足堆的性质。

#include<cstdio>
#include<cstring>
#include<ctime>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int maxn=1e6+10;
struct Treap
{
    struct zp
    {
        int son[2];
        int fix,id,p;
    } tree[maxn];
    int root,sz;
    void init()
    {
        root=0;
        sz=0;
    }
    int newnode(int id,int p)
    {
        sz++;
        tree[sz].fix=rand();//随机优先级
        tree[sz].id=id,tree[sz].p=p;
        tree[sz].son[0]=tree[sz].son[1]=0;
        return sz;
    }
    void rotate(int &o,int d)//旋转操作 0代表左旋 1代表右旋
    {
        int k=tree[o].son[d^1];
        tree[o].son[d^1]=tree[k].son[d];
        tree[k].son[d]=o;
        o=k;
    }
    void remove(int &u,int p)//删除操作 删除题目上优先级为p的节点
    {
        if(tree[u].p==p)
        {
            if(tree[u].son[0]!=0&&tree[u].son[1]!=0)//当这个点的两个儿子都不为空时为了删除它就要将它往下旋转,直到它的某个儿子为空为止
            {
                int d=tree[tree[u].son[0]].fix<tree[tree[u].son[1]].fix?0:1;//判断是左旋还是右旋
                rotate(u,d);
                remove(tree[u].son[d],p);//递归删除
            }
            else//某个儿子节点为空后删除节点,将不为空的节点接到它的父节点上
            {
                    if(tree[u].son[0]==0) u=tree[u].son[1];
                    else u=tree[u].son[0];
            }
        }
        else remove(tree[u].son[p>tree[u].p],p);
    }
    void insert(int &i,int id,int p)//插入
    {
        if(i==0) i=newnode(id,p);
        else
        {
            int d=p<tree[i].p?0:1;//判断找那个儿子
            insert(tree[i].son[d],id,p);
            if(tree[i].fix<tree[tree[i].son[d]].fix) rotate(i,d^1);//递归回来后进行旋转
        }
    }
    void query(int &i,int d)//查询最大值 最小值
    {
        if(i==0)
        {
            printf("0\n");
            return ;
        }
        if(tree[i].son[d]==0)
        {
            printf("%d\n",tree[i].id);
            remove(root,tree[i].p);
        }
        else query(tree[i].son[d],d);
    }
}ac;
int main()
{
    ac.init();
    int opt;
    while(scanf("%d",&opt)!=EOF && opt)
    {
        if(opt==1)
        {
            int id,p;
            scanf("%d%d",&id,&p);
            ac.insert(ac.root,id,p);
        }
        else ac.query(ac.root,(opt-2)^1);
    }
    return 0;
}
Frenet坐标系下动态街道场景的最优轨迹生成 本文详细解读了Lattice Planner 阅读详情

相关推荐

论文阅读4——一种宽频带圆极化微带天线的设计

论文阅读——一种宽频带圆极化微带天线的设计(现在才觉得开始弄懂了一点,懂了一点之后又更糊涂了……)

weixin_64612422的博客 2315

python高级算法与数据结构:treap用于构造平衡二叉树的算法分析

treap数据结构用于记录两个维度的索引,一个维度跟随二叉树性质,能做到完全排序,另一个维度跟随堆性质,能做到部分排序,实际上treap本质目的并不在于此,它的目的在于用来平衡二叉树。在某些情况下二叉树可能会变成链表,例如依次插入已经排好序的元素时,所有的元素会沿着节点的有孩子,这种二叉树就不具备lg(n)搜索效率。 很多方法用来解决这个问题,例如2-3树,红黑树等。这些方法存在问题在于操作相当复杂,你去搜索一下红黑树的插入或删除操作就能体会它们应用起来的复杂性。前几节详细描述了treap如何根据其节点优先

tyler_download的专栏 427

OpenMV模块视觉测距(避障)+颜色识别+TFT-LCD显示(实现原理与代码分析)

上图所示代码实际运行的帧率比较低,主要原因有以下两个:1.硬件问题,博主使用的版本比较低,可以尝试使用高版本OpenMV2.图像滤波问题。之前加入图像滤波是想提高色块识别的准确性,但是相应的运算速度也会下降。

ediykk的博客 1万+

Treap树堆

主要体现的思想是随机插入数字,会给每个数字赋予一个优先级——>目的是让插入的关键字满足二叉树(节点的性质满足=(关键字:优先级))特点:被旋转的节点的左子树会到原父节点的右子树上(节点左旋,那么节点的右子树还是一直挂着保护着的)2.后面发现关键字2的优先级

weixin_57128596的博客 841

从零开始搭建多旋翼无人机:飞控系统配置全攻略(含IMU校准技巧)

本文详细介绍了从零开始搭建多旋翼无人机的飞控系统配置全流程,重点解析了IMU校准技巧。涵盖飞控硬件选型、IMU校准(加速度计、陀螺仪、磁力计)、GPS与罗盘集成方案、飞行模式配置策略及实战故障排查手册,帮助DIY爱好者提升无人机飞行稳定性与安全性。

beta5的博客 796

从BUCK-BOOST到反激:一个‘拆电感’的视角,轻松理解多路输出交叉调整

本文从BUCK-BOOST电路到反激变换器的演变入手,通过‘拆解电感’的独特视角解析多路输出交叉调整机制。深入探讨了反激电路的能量暂存方式、传递路径变化及电压关系,并结合具体参数对比揭示其特性。针对多路输出中的电压平衡问题,提供了绕组排布优化、元器件选型等实战技巧,帮助工程师有效提升电源系统的稳定性与效率。

weixin_33738578的博客 435

【数据结构】图文详解Treap平衡树

一、前言 FHQ平衡树是一种树形数据结构,它是对二叉查找树的一种优化方式,但是学习的过程是真的非常的…痛苦。 二、二叉查找树的概念 首先,我们称具有以下3个性质的树为二叉查找树(BST) 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。 如图 在这张图中我们可以发现,在二叉查找树中,从根结点开始查找一个点的时间复杂度为logn级别,在我们想对树进行插入查找的时候都非常方便。 但是很遗憾,二叉查找树是有着它的缺陷的

qq_49688477的博客 2122

Linux内核编程(十三)Input输入子系统

Input 子系统是 Linux 内核中专门为输入设备设计的一个子系统,它提供了一个通用的框架来管理各种输入设备,如键盘、鼠标、触摸屏、游戏手柄等。这个子系统的主要目的是简化和规范化输入设备驱动的开发,同时提高驱动的通用性和兼容性。(1)输入设备:如键盘、鼠标、触摸屏、游戏手柄等,它们是用户与计算机进行交互的主要方式。(2)输入设备驱动的复杂性:传统上,为每种输入设备编写驱动都需要创建文件、进行硬件初始化、实现文件操作函数集和处理中断等。每种设备的驱动可能都有许多重复性的工作。

qq_1033275663的博客 2864

数据结构(5) treap

Treap

weixin_64197656的博客 1457

【WRF工具】WRF 模型输出可视化工具 RIP4

【WRF工具】WRF 模型输出可视化工具 RIP4

WW、forever的博客 1593

K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

🔴 K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2万+

数据结构之Treap

作者:Dong | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址:http://dongxicheng.org/structure/treap/ 1. 概述 同splay tree一样,treap也是一个平衡二叉树,不过Treap会记录一个额外的数据,即优先级。Treap在以关键码构成二叉搜索树的同时,还按优先级来满足堆的性质。因而,Treap=tre

cinience的专栏 831

C#调用opencv的dll

opencv算法和界面配合,刚入职的时候尝试过,利用的MFC,调试起来很痛苦。 后来基本都没怎么用界面,DOS的黑窗口,opencv自带的显示界面及滑动条凑合着调试用。 最近有点时间,刚好双十一在一个视觉群里看到了一个讲C#调用opencv的dll的课程,鉴于群主也是那门课的讲师,在平时解答群员的问题的时候很细心,能力也很强,因此有了这篇文章。 根据相机不同动态调用相机默认的属性...

Learning by doing 2972

浅谈无旋treap(fhq_treap)

一、简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树。 无旋Treap是一个叫做范浩强的大佬发明的(快%啊!) 在我们一起学习无旋Treap之前,本蒟蒻有几句活想说: 1.无旋Treap我个人认为是最容易理解的一种平衡树,而且编程复杂度不高,功能还那么强大。 ...

aaa3201的博客 1646

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

算法导论13-4:Treap

花了一晚上终于解决了《算法导论》13-4 中的思考题 Treap,之前学习的时候就发现这块的内容网上都找不到什么参考资料,面对a---j这几个思考题一筹莫展,今晚静下心来好好研究了下,发现也不是那么难啃。搞算法,就是要沉得住气。

彦祖老师 2633

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

[C++ 学习笔记] FHQ-Treap (无旋 Treap)

C++ FHQ-Treap - 无旋 Treap - 树堆 学习笔记

lzl20220405的博客 3171

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

无旋Treap——FHQ Treap

FHQ Treap

Lucas_FC_的博客 948

Treap模板

一个新的Treap板子 先放代码 #include<cstdio> #include<cctype> #include<algorithm> #include<functional> template<typename _Tp,typename _Cmp=std::less<_Tp> > class fhq_treap:_Cmp { public: typedef _Tp Value_type;

qq_42722211的博客 269

最强平衡树——Treap[以我的最弱击败你的最强]

以我的最弱战胜你的最强!!——Treap本人蒟蒻,在平衡树坑中深陷数年。为了早日逃离此天坑,特作此文。什么是平衡树?度娘传送门 什么是treap?ACdreamers%%% 注:本篇所有代码都在片尾!!(醒目)CMP那么了解了这些,我们先列出一个list NAME 优势 劣势 splay LCT,序列之王 常数大,代码量稍大 RBT 自适应深度平衡树,速度在同类BS

lemonoil的博客 955

平衡树——treap

一种是要删除的数在叶子节点上,那么我们直接把这个叶子节点的下标修改成0即可,因为我们在上一层传入的是它父节点的tr[u].l或者tr[u].r的引用,所以这里直接赋成0就相当于将它父节点的左指针或者右指针的指向修改成空;通过前三个赋值,我们已经实现了子节点的交换,相对于原来的p的父节点的更新我们该怎么实现了,显然我们没有存父节点的信息, 不能从子节点访问到父节点,但是我们肯定是在递归中实现的,我们只要在递归的时候传入tr[u].l的引用,那么在这一层进行修改的时候就可以实现对tr[u].l的修改。

m0_74120503的博客 1696

Treap + FHQ Treap

一:Treap 支持:插入、删除、查询 xxx 的排名、查询排名为 xxx 的数、查前驱、查后继、左旋右旋 模板题:P3369 【模板】普通平衡树 #include<bits/stdc++.h> #define rint register int #define deb(x) cerr<<#x<<" = "<<(x)<<'\n'; using namespace std; typedef long long ll; typedef pair &lt

Scar_Halo 334

总结-Treap

最近学习了Treap

Continue 2291

非旋treap (fhq treap)

平衡树 非旋treap fhq treap

Josh_Shu_的博客 1170

Treap树

Treap(Tree + Heap)是一种结合二叉搜索树(BST)和堆(Heap)特性的数据结构。每个节点包含两个值:通过随机分配优先级,Treap在期望上能保持平衡,避免普通BST退化为链表的极端情况。插入操作删除操作查找操作 与普通BST相同,时间复杂度为 (O(\log n))(期望)。旋转Treap基础概念 核心逻辑:按照BST规则插入后,通过旋转恢复堆性质。 核心逻辑:通过旋转将待删除节点移至叶子节点后直接删除。 排名定义:小于该值的节点数 + 1。 例题:

2401_88124440的博客 703

treap

treap的讲解网上的版本很多, 这列就不在缀余了,这里主要是讲一下treap中涉及到记录左右儿子个数的旋转,删除,插入: 首先是插入:插入这列基本与裸的TREAP一样,只需要加两句话即可: void insert(int &x,int y)//注意x前面的&。 { if (x==0) { x=++size; ...

weixin_30652897的博客 137

平衡树·从BST到treap到fhq-treap

挖坑

NephrenRuqInsania 678
上一篇: 动态主席树
下一篇: 伸展树(Splay)
acmer_zp
博客等级 码龄11年 18粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值