当前位置: 首页 > news >正文

「模板」 FHQ_Treap

「模板」 FHQ_Treap


我也是偶然发现我还没发过FHQ_Treap的板子。

那就发一波吧。

这个速度实在不算快,但是不用旋转,并且好写

更重要的是,Splay 可以做的事情它都可以做!比如区间操作,以及LCT相关…

而且它还可以可持久化!(虽然目前还没有学)

Capella 认为,不涉及区间操作时,用快一些的平衡树(SBT/Treap/替罪羊...)较好,涉及区间操作而又不想写大量代码的话,FHQ_Treap 不失为一种极好的选择。

下一篇写 FHQ_Treap 的区间操作。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
const int MAXN=100010;
int n;
class FHQ_Treap
{
    public:
        int rt;
        FHQ_Treap(void)
        {
            rt=cnt=0;
            memset(a,0,sizeof a);
            memset(s,0,sizeof s);
        }
        void Insert(int x)
        {
            int l=0,r=0,t=0;
            MakeNode(t,x),Split(rt,x,l,r);
            Merge(l,l,t),Merge(rt,l,r);
        }
        void Erase(int x)
        {
            int l=0,r=0,t=0;
            Split(rt,x,l,r),Split(l,x-1,l,t);
            Merge(t,s[t].c[0],s[t].c[1]),Merge(l,l,t),Merge(rt,l,r);
        }
        int Rank(int x)
        {
            int l=0,r=0,ans;
            Split(rt,x-1,l,r),ans=s[l].size+1,Merge(rt,l,r);
            return ans;
        }
        int Find(int i,int x)
        {
            int t;
            while(x!=(t=s[s[i].c[0]].size+1))
                if(x<t)
                    i=s[i].c[0];
                else
                    x-=t,i=s[i].c[1];
            return s[i].v;
        }
        int Pre(int x)
        {
            int l=0,r=0,ans;
            Split(rt,x-1,l,r),ans=Find(l,s[l].size),Merge(rt,l,r);
            return ans;
        }
        int Next(int x)
        {
            int l=0,r=0,ans;
            Split(rt,x,l,r),ans=Find(r,1),Merge(rt,l,r);
            return ans;
        }
    private:
        bool a[MAXN];
        int cnt;
        struct node
        {
            int v,p,size,c[2];
        }s[MAXN];
        int Random(void)
        {
            int x;
            while(a[x=rand()%MAXN]);
            a[x]=1;
            return x;
        }
        void Update(int i)
        {
            s[i].size=s[s[i].c[0]].size+s[s[i].c[1]].size+1;
        }
        void MakeNode(int &i,int x)
        {
            s[i=++cnt].v=x,s[i].p=Random(),s[i].size=1;
        }
        void Split(int i,int x,int &l,int &r)
        {
            if(!i)
            {
                l=r=0;
                return;
            }
            else if(x<s[i].v)
                Split(s[r=i].c[0],x,l,s[i].c[0]);
            else
                Split(s[l=i].c[1],x,s[i].c[1],r);
            Update(i);
        }
        void Merge(int &i,int l,int r)
        {
            if(!l || !r)
            {
                i=l|r;
                return;
            }
            else if(s[l].p>s[r].p)
                Merge(s[i=l].c[1],s[l].c[1],r);
            else
                Merge(s[i=r].c[0],l,s[r].c[0]);
            Update(i);
        }
}T;
int main(int argc,char *argv[])
{
    srand((unsigned)time(NULL));
    scanf("%d",&n);
    for(int i=1,opt,x;i<=n;++i)
    {
        scanf("%d %d",&opt,&x);
        switch(opt)
        {
            case 1:
                T.Insert(x);
                break;
            case 2:
                T.Erase(x);
                break;
            case 3:
                printf("%d\n",T.Rank(x));
                break;
            case 4:
                printf("%d\n",T.Find(T.rt,x));
                break;
            case 5:
                printf("%d\n",T.Pre(x));
                break;
            case 6:
                printf("%d\n",T.Next(x));
                break;
        }
    }
    return 0;
}

谢谢阅读。

转载于:https://www.cnblogs.com/Capella/p/8502857.html

相关文章:

  • Centos7安装Oracle12c
  • C#下载文件,Stream 和 byte[] 之间的转换
  • 机器学习十一-特征选择与稀疏学习
  • LoadRunner11录制时不能弹出IE浏览器
  • Swift4.0复习访问控制与作用域
  • nginx代理PHP获取IP 的问题
  • git-命令使用
  • C#解析Json
  • Integer值判断是否相等问题
  • EntityFramework Core 2.0 Explicitly Compiled Query(显式编译查询)
  • C语言数组的概念
  • shell中获取当前目录
  • kali使用Fluxion钓鱼WiFi
  • python url中文转码
  • 【网摘】将图片地址直接 转为 base64
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【EOS】Cleos基础
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 2018一半小结一波
  • echarts的各种常用效果展示
  • IOS评论框不贴底(ios12新bug)
  • JDK 6和JDK 7中的substring()方法
  • js学习笔记
  • text-decoration与color属性
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 给新手的新浪微博 SDK 集成教程【一】
  • 关于for循环的简单归纳
  • 坑!为什么View.startAnimation不起作用?
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 聊聊hikari连接池的leakDetectionThreshold
  • 浅谈web中前端模板引擎的使用
  • 在weex里面使用chart图表
  • Prometheus VS InfluxDB
  • 进程与线程(三)——进程/线程间通信
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (¥1011)-(一千零一拾一元整)输出
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (差分)胡桃爱原石
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)菜鸟学数据库(三)——存储过程
  • (转)我也是一只IT小小鸟
  • ***测试-HTTP方法
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 依赖注入和配置系统
  • .NET业务框架的构建
  • @EventListener注解使用说明