首页 > 其他分享 >Treap树学习笔记

Treap树学习笔记

时间:2023-05-16 16:36:01浏览次数:38  
标签:begin return int pos 笔记 bound 学习 Treap Maxn

等我写完。

普通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(普通平衡树)

相当优美了属于是。

 

标签:begin,return,int,pos,笔记,bound,学习,Treap,Maxn
From: https://www.cnblogs.com/Miya555/p/17406052.html

相关文章

  • 手把手教你如何下载超星学习通课件资料
    前言:很多同学都想知道超星学习通中课程资料怎么下载,但是超星学习通中某个课程的目录中展示的资料是不提供直接下载方式的,所以下面就教大家如何下载目录中展示的资料,包括PPT和PDF。一、电脑登录超星学习通网页版,复制课程链接网页版超星学习通登录入口:【https://i.chaoxing.com】......
  • 什么是人工智能领域的深度学习?
    深度学习是人工智能领域的一个重要分支,它是机器学习的一个子集,专注于构建和训练神经网络。深度学习算法试图模拟人脑的工作原理,从大量原始数据中学习复杂的特征和模式。这种学习方法使得机器能够在许多任务中实现类人的性能,如图像识别、自然语言处理、语音识别等。深度学习的核心......
  • 同余的定义以及基本性质学习笔记
    来自潘承洞、潘承彪《初等数论》,有删改。一、定义定义1(同余)设\(m\ne0\)。若\(m\mida-b\),即\(a-b=km\),则称\(m\)为模,\(a\)同余于\(b\)模\(m\)以及\(b\)是\(a\)对模\(m\)的剩余,记作\[a\equivb\pmodm(1)\]否则,则称\(a\)不同余于\(b\)模\(m\),\(b\)不......
  • 统计学习方法笔记-感知机学习方法
    感知机(Perceptron)1.感知机模型1.1感知机定义​ 输入空间$\mathcal{X}\subseteq\mathbb{R}^n$,输出空间\(\mathcal{Y}\)={+1,-1};​ 输入\(x\in\mathcal{X}\)表示的实例的特征向量,对应于输入空间的点,输出\(y\in\mathcal{Y}\)表示的实例的类别;由输入空间到输出空间的......
  • Rust 笔记 - 2
    结构体初始化Rust的结构体类似于C,使用关键字struct声明。structUser{active:bool,sign_in_count:u32,username:String,email:String}结构体中的每个元素称为“域”(field),域是可修改的(mutable),使用.来访问域的值。创建实例为了使用结构体,需要根据结......
  • APNS原理笔记
    昨天虽然配置APNS成功,但对它的原理并并不是很清楚。今天翻了一下EricaSadun的cookbook,发现专门有一章是讲这个的,对它的来龙去脉讲得比较清楚。笔记一下。“通过APNS推送通知需要3个条件:SSL证书,设备ID和要发送的通知得自定义有效内容。”iOSProvisioningPor......
  • 学习Web前端有什么好方法吗?
    很多人想要学习Web前端,但是又不知道从何入手。事实上,想要学好Web前端,掌握正确的学习方法很重要。为大家具体讲解一下,学习Web前端需要掌握的学习方法有哪些。 一、了解什么是Web前端 所谓“知己知彼,百战不殆”,在学习Web前端之前,首先应该了解什么是Web前端。所有的用户终端产品与视......
  • 《啊哈C语言——逻辑的挑战》学习笔记
    第一章梦想启航第1节让计算机开口说话1、基础知识1)计算机“说话”的两种方式显示在屏幕上通过喇叭发出声音2)计算机“说话”之显示在屏幕上格式:printf("");注意:printf要加“f”printf后要加括号()双引号""内是要计算机“说的内容”所有符号全在英文符号环境下输入分......
  • Java学习笔记
    一、JAVA发展简史1.JAVA的诞生​在1991年时候,詹姆斯·高斯林(JamesGosling)在SUN公司的工程师小组想要设计这样一种小型计算机语言。该语言主要用于像电视盒这样的消费类电子产品。2.JAVA的发展史1991年,Sun公司的Green项目(Oak语言)1995年,推出JAVA测试版1996......
  • Unreal Engine 大象无形学习笔记(第二部分:虚幻引擎浅析)
     Q1.虚幻引擎的Main函数在哪?LaunchWindows.cpp中找到WinMain。Q2.虚幻引擎为什么要引入模块机制?编辑器模式、发布模式要单独配置非常麻烦。工具:UnrealBuildTool包含大模块:Runtime、Development、Editor、Plugin每个模块包含:Public、Private文件夹,.build.cs文件作用......