可持久化Treap

你不必懂AI,但必须会用AI:写给所有焦虑中的职场人 AI时代不必焦虑学技术,关键在于用AI解决实际问题。文章指出,99%的人只需成为AI使用者而非建造者,核心竞争力在于结合业务痛点运用AI工具提升效率。与其盲目学习工具,不如梳理工作流程,识别可优化环节,让AI赋能重复性、标准化任务。行业经验与AI工具的结合才是真正的职场护城河。建议从具体工作场景出发,寻找匹配的AI解决方案,迈出应用第一步。 阅读详情

函数意义

可持久化Treap本质上市一个二叉平衡树,若不对其规则进行修改,中序遍历后得出的序列是递增的。
void maintain(o): 计算结点o的size
int lowCount(key): 比key所在位置小1
int upperCount(key): key所在的位置,如果有多个相同的key,选位置最大的
int select(int k): 找出第k小的数的值
Node* merge(Node* a, Node* b): 合并,要用rank来合并
void split(Node*a, int k, Node*& l, Node*& r): 拆分,k包含在l中
int rank(int key): key的排名
void insert(int key): 插入key
int pred(int key): 找前驱,比key小的数中最大的那个
int succ(int key):找后继,比key大的数中最小的那个

数组版(洛谷平衡树模板题)

#include <iostream>
using namespace std;
const int maxn = 1e6+5;
#define lc son[o][0]
#define rc son[o][1]
struct Treap {
    int son[maxn][2], val[maxn], r[maxn], sz[maxn];
    bool flag[maxn];
    int root,tot;
    int node(int x) {
        val[tot] = x;
        sz[tot] = 1;
        son[tot][0] = son[tot][1] = 0;
        flag[tot] = false;
        r[tot] = rand();
        return tot++;
    }
    void init() {
        root = 0; tot = 1;
        son[0][0] = son[1][0] = sz[0] = r[0] = 0;
    }
    void maintain(int o) {
        sz[o] = 1;
        sz[o] += (sz[lc]+sz[rc]);
    }
    void split(int o, int k, int &l, int &r) {
        if(o == 0) {
            l = r = 0;
        }
        else if(sz[lc] >= k) {
            r = o;
            split(lc, k, l, lc);
            maintain(o);
        }
        else {
            l = o;
            split(rc, k-sz[lc]-1, rc, r);
            maintain(o);
        }
    }
    int merge(int a,int b) {
        if(a == 0 || b == 0) {
            return a+b;
        }
        if(r[a] < r[b]) { // 必须按rank
            son[a][1] = merge(son[a][1], b);
            maintain(a);
            return a;
        }
        else {
            son[b][0] = merge(a, son[b][0]);
            maintain(b);
            return b;
        }
    }   
    
    int lowCount(int o,int x){
        if(o == 0)
            return 0;
        return val[o] >= x ? lowCount(lc, x) : lowCount(rc, x)+sz[lc]+1;
    }
    int upCount(int o, int x) {
        if(o == 0)
            return 0;
        return val[o] > x ? upCount(lc, x) : upCount(rc, x)+sz[lc]+1;
    }
    int rank(int x) {
        return lowCount(root, x)+1;
    }
    int kth(int k) {
        return select(root, k);
    }
    int select(int o, int k) {
        while(sz[lc]+1 != k) {
            if(sz[lc] >= k) {
                o = lc;
            }
            else {
                k -= (sz[lc]+1);
                o = rc;
            }
        }
        return val[o];
    }
    
    void insert(int x) {
        int pos = lowCount(root, x);
        int a,b;
        split(root, pos, a, b);
        int t = node(x);
        root = merge(merge(a, t), b);
    }
    void del(int val){
        int pos = lowCount(root, val);
        int a,b,x,y;
        split(root, pos, a, b);
        split(b, 1, x, y);
        root = merge(a, y);
    }
    int pred(int x) {
        return kth(lowCount(root, x));
    }
    int succ(int x) {
        return kth(upCount(root, x)+1);
    }
    void show() {
        print(root);
    }
    void print(int o) {
        if(lc != 0)
            print(lc);
        cout << val[o] << endl;
        if(rc != 0)
            print(rc);
    }
};
Treap treap;
typedef long long ll;
inline int readInt() {
    int n = 0, ch = getchar();
    bool flag = false;
    while (!isdigit(ch)) flag |= ch == '-', ch = getchar();
    while (isdigit(ch)) n = n * 10 + ch - '0', ch = getchar();
    return flag ? -n : n;
}
int main() {
    int n;
    treap.init();
    scanf("%d", &n);
    while(n--) {
        int opt,val;
        opt = readInt();
        val = readInt();
        if(opt == 1) {
            treap.insert(val);
        }
        if(opt == 2) {
            treap.del(val);
        }
        if(opt == 3) {
            cout << treap.rank(val) << endl;
        }
        if(opt == 4) {
            cout << treap.kth(val) << endl;
        }
        if(opt == 5) {
//            treap.show();
            cout << treap.pred(val) << endl;
        }
        if(opt == 6) {
            cout << treap.succ(val) << endl;
        }
    }
//    treap.show();
    return 0;
}

指针版(Uva11922)

#include <iostream>
using namespace std;
const int maxn = 1e6+5;
#define lc son[o][0]
#define rc son[o][1]
struct Treap {
    int son[maxn][2], val[maxn], r[maxn], sz[maxn];
    bool flag[maxn];
    int root,tot;
    int node(int x) {
        val[tot] = x;
        sz[tot] = 1;
        son[tot][0] = son[tot][1] = 0;
        flag[tot] = false;
        r[tot] = rand();
        return tot++;
    }
    void init() {
        root = 0; tot = 1;
        son[0][0] = son[1][0] = sz[0] = r[0] = 0;
    }
    void maintain(int o) {
        sz[o] = 1;
        sz[o] += (sz[lc]+sz[rc]);
    }
    void split(int o, int k, int &l, int &r) {
        if(o == 0) {
            l = r = 0;
        }
        else if(sz[lc] >= k) {
            r = o;
            split(lc, k, l, lc);
            maintain(o);
        }
        else {
            l = o;
            split(rc, k-sz[lc]-1, rc, r);
            maintain(o);
        }
    }
    int merge(int a,int b) {
        if(a == 0 || b == 0) {
            return a+b;
        }
        if(r[a] < r[b]) { // 必须按rank
            son[a][1] = merge(son[a][1], b);
            maintain(a);
            return a;
        }
        else {
            son[b][0] = merge(a, son[b][0]);
            maintain(b);
            return b;
        }
    }   
    
    int lowCount(int o,int x){
        if(o == 0)
            return 0;
        return val[o] >= x ? lowCount(lc, x) : lowCount(rc, x)+sz[lc]+1;
    }
    int upCount(int o, int x) {
        if(o == 0)
            return 0;
        return val[o] > x ? upCount(lc, x) : upCount(rc, x)+sz[lc]+1;
    }
    int rank(int x) {
        return lowCount(root, x)+1;
    }
    int kth(int k) {
        return select(root, k);
    }
    int select(int o, int k) {
        while(sz[lc]+1 != k) {
            if(sz[lc] >= k) {
                o = lc;
            }
            else {
                k -= (sz[lc]+1);
                o = rc;
            }
        }
        return val[o];
    }
    
    void insert(int x) {
        int pos = lowCount(root, x);
        int a,b;
        split(root, pos, a, b);
        int t = node(x);
        root = merge(merge(a, t), b);
    }
    void del(int val){
        int pos = lowCount(root, val);
        int a,b,x,y;
        split(root, pos, a, b);
        split(b, 1, x, y);
        root = merge(a, y);
    }
    int pred(int x) {
        return kth(lowCount(root, x));
    }
    int succ(int x) {
        return kth(upCount(root, x)+1);
    }
    void show() {
        print(root);
    }
    void print(int o) {
        if(lc != 0)
            print(lc);
        cout << val[o] << endl;
        if(rc != 0)
            print(rc);
    }
};
Treap treap;
typedef long long ll;
inline int readInt() {
    int n = 0, ch = getchar();
    bool flag = false;
    while (!isdigit(ch)) flag |= ch == '-', ch = getchar();
    while (isdigit(ch)) n = n * 10 + ch - '0', ch = getchar();
    return flag ? -n : n;
}
int main() {
    int n;
    treap.init();
    scanf("%d", &n);
    while(n--) {
        int opt,val;
        opt = readInt();
        val = readInt();
        if(opt == 1) {
            treap.insert(val);
        }
        if(opt == 2) {
            treap.del(val);
        }
        if(opt == 3) {
            cout << treap.rank(val) << endl;
        }
        if(opt == 4) {
            cout << treap.kth(val) << endl;
        }
        if(opt == 5) {
//            treap.show();
            cout << treap.pred(val) << endl;
        }
        if(opt == 6) {
            cout << treap.succ(val) << endl;
        }
    }
//    treap.show();
    return 0;
}

Python 爬虫实战:龙虎榜机构买卖数据爬取与代码详解(附数据分析) 龙虎榜是证券市场中重要的市场信息之一,记录了当日大宗交易及机构买卖情况,包括机构名称、买卖方向、成交金额、成交股数、买入卖出价格等信息。通过分析龙虎榜数据,投资者可以更好地了解市场动向和机构投资者的行为,从而做出更准确的决策。本文将详细介绍如何使用 Python 编写爬虫程序,高效地抓取龙虎榜机构买卖数据,并进行数据分析。我们将从环境搭建、数据抓取、数据存储到数据分析等关键步骤逐一展开,帮助读者掌握完整的爬虫实战流程。 阅读详情

相关推荐

Teams会议翻译对比测试:Copilot同传 vs 人工翻译,结果出乎意料

本文通过对比测试Microsoft 365 Copilot的实时翻译与专业人工翻译在Teams会议中的表现,揭示了AI同传技术在准确率、响应速度和多语言切换方面的优势与局限。实验数据显示,Copilot在常规商务场景下接近人工翻译水平,且成本效益显著,但在专业术语和文化特定表达上仍需人工辅助。

weixin_29054195的博客 223

可持久化treap

平衡树是一个有用的结构,但是常用的splay等由于均摊复杂度和旋转操作,无法方便的可持久化。 这时候跳出一个treap,他可以可持久化! treap是一种笛卡尔树,有两个值:位置与权。这样构建出来的treap满足两个性质:1、左儿子位置小于当前节点小于右儿子,2、儿子的权值小于父亲。容易猜想,若权值随机,则树高是O(logn)。 使用类似二叉堆的旋转操作可以很方便的维护treap,但是还有一

miaom的博客 861

模拟滤波器的基础知识和设计

使用Python实现多种模拟滤波器

faltas的博客 3529

可持久化非旋Treap

#普通非旋Treap 看这里

某司机的黑车 377

Oracle 11g版本下载及安装超详细教程图解

新手Oracle安装教程

weixin_43738344的博客 10万+

IEEE S&P 2026 大模型安全论文整理

本文梳理了 IEEE S&P 2026(第47届 IEEE 安全与隐私研讨会)中与 LLM Safety 相关的论文,涵盖大模型越狱攻击、防御与对齐、隐私保护、RAG 安全、多模态大模型安全、智能体安全、图-LLM 安全、工具链安全及生成式 AI 安全与隐私等方向。

CSPhD-winston的博客 1331

可持久化Treap学习小结

可持久化Treap与Treap可持久化Treap与Treap的区别在于哪里? 维持平衡的方式:可’用Split和Merge,而Treap使用rotate Other:可’可以分裂(Split)和合并(Merge)MergeMerge操作类似于线段树的合并,但是Merge的两棵Treap一定要保证一棵的key值都小于第二棵的key值int Merge(u,v){//保证u的子树的key值小于v的子

samjia2000的博客 1396

筹码峰五句口诀,看懂主力的秘密动作!(附实战图示)

筹码图的价值在于,它不像K线那样容易造假。主力可以骗线,但骗不了筹码分布。主力在不在;是吸筹还是出货;接下来是变盘还是震荡。这五句口诀可以说是“筹码阅读的入门圣经”:单峰坚挺变盘在即,双峰对垒高抛低吸;上峰不移主力在跑,多峰林立行情不止;下峰不移不离不弃,筹码识庄稳中取利!📌市场从来不是靠猜,而是靠看清。筹码,就是主力最真实的痕迹。如果你想学会提前布局、跟庄不被甩,学会看筹码峰——这一步必须打牢!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1162

UVA 12538 可持久化treap入门

还新学了能可持久化的treap 看了一下clj的《可持久化数据结构研究》论文。 做了一下UVA 12538,算是会了一点点了。 可持久化treap不用进行rotate操作,它有两个基本的操作 merge(a,b):把 treap与treap>合并成treap  split(a,k):把treap>的前k个变成一个treap,剩下的元素变成treap 可以根据需要来选择是否实现可持久

Nicolas 3002

PyTorch生成式人工智能(25)——基于Transformer实现机器翻译

不同于循环神经网络 (RNN) 按顺序处理数据,Transformer 以并行的方式处理输入数据(例如句子)。这种并行处理提高了效率,但并未使其能够识别输入的顺序。为了解决这个问题,Transformer 向输入的词嵌入中添加了位置编码。这些位置编码是分配给输入序列中每个位置的独特向量,其维度与输入词嵌入对齐。本节将以英语到法语的翻译为例,通过介绍如何训练 Transformer 模型将英语句子转换为法语,深入理解 Transformer 的架构及自注意力机制的运作方式。

盼小辉丶的博客 2715

YOLOv8 眼底病变检测(眼底照片)详细说明

本文介绍了基于YOLOv8的眼底病变自动检测系统。该系统可识别糖尿病视网膜病变、青光眼等5类常见眼底病变,包括微动脉瘤、出血点等特征。核心技术包含图像预处理、模型训练、病变检测与量化分析三个模块,采用1024×1024高分辨率输入,针对医学图像特点优化数据增强策略。系统支持批量处理、可视化标注和临床报告生成,提供病变数量、面积密度和严重程度评分等量化指标。特别强调医学合规性要求,需专业医生参与数据标注和模型验证,符合医疗器械认证标准。该系统可作为眼科医生的辅助诊断工具,提高眼底病变筛查效率。

u010117029的博客 133

可持久化无旋Treap学习

可持久化无旋Treap 今天又学习了可持久化非旋Treap,其实很简单,将普通的非旋Treap持久化一遍就行了。具体来说,就是将每次操作后得到的树记录下来,每次需要改变一个点的信息时,将原有的点的信息记录下来,建一个新点去更改它的信息。 其实持久化的过程与线段树的持久化相似。 其实打出来跟普通的非旋Treap差不多,加几个改点的步骤即可。 非旋Treap学习见此处:非旋Treap学习 模...

StaroForgin的博客 255

智启古文字新章:AI、ML与大数据驱动的知识图谱构建

摘要:本文聚焦AI、ML与大数据驱动的古文字知识图谱构建。开篇点明古文字研究困境,凸显技术革新迫切性。随后阐释AI、ML、大数据基础概念,详解其在图谱构建里的数据采集、知识抽取、关系挖掘运作流程,穿插线性代数、概率论等数学原理。实战展示殷商甲骨文图谱搭建全程,含数据处理、模型训练。还探讨跨模态融合等前沿挑战应对,兼述技术融合衍生的教育科普革新、伦理文化责任、国际合作交流,勾勒古文字数字永生的长远愿景。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1614

无旋Treap的可持久化

无旋Treap的可持久化 解析 其实FHQTreapFHQ TreapFHQTreap的可持久化非常好理解,只需要的每次操作的rtrtrt用数组记录下来,然后操作时,节点新建即可 模板题 P3835 注意操作细节 注意数组大小 注意rand()rand()rand()的值域 代码 #include<bits/stdc++.h> #define int long long #define...

Daniel__d的博客 213

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

treap模板(set,map,multiset, 可持久化treap)

全部模板:https://github.com/9974/DataStructures/tree/master/treap 以前treap学得不怎么扎实,最近用重新温习了一下。 写法不同,它能实现set,map,multiset等不同的功能。 与STL相比增加的功能就是: 1.求第k大的数, 2.求一个数v是第几大的数   等等功能 学了能可持久化的treap

Nicolas 2273

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

非旋Treap及其可持久化

平衡树这种东西,我只会splay。splay比较好理解,并且好打,操作方便。 我以前学过SBT,但并不是很理解,所以就忘了怎么打了。 许多用平衡树的问题其实可以用线段树来解决,我们真正打平衡树的时候一般都是维护序列之类的。 维护序列时,splay特别方便,所以一般情况下打splay就好了。其它的平衡树也可以,可是如果见到翻转操作的时候,那些平衡树就会崩(至少我不知道那些平衡树有什么可以翻转的做法)...

A1847225889的博客 453

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

可持久化无旋treap(良心讲解 P3835)

前置技能:无旋treap 什么是可持久化平衡树? 每经过一次操作,当前状态的整棵树就成为一棵全新版本的树,给每个版本编个号,我们可以根据版本号查找这格版本的树中的一些信息,也可以在这个版本上进行修改生成全新版本。 我们需要保留每个版本的所有信息。 可持久化无旋treap的大体思想 由于treap的树的期望深度为O(logn)级别,所以每次操作(插入/删除等)只涉及O(logn)个节点的修...

shadiao.的博客 476

模板 - 可持久化无旋Treap

空间消耗非常玄学,有多大开多大就完事了。其实是因为单次操作可能会有数次Merge和Split操作,按照下面的版本的话Merge和Split都进行复制,所以一次操作可能复制了4个版本。 四个函数式查询,然后Merge的时候拷贝对应的xy子树,Split的时候拷贝p树。事实上,Merge和Split总是成对出现,只需要在其中喜欢的一个进行可持久化(复制节点)就可以了,比较推荐在Split的时...

weixin_30882895的博客 134

非旋转式treap及可持久化

可持久化Treap

srand(time(0)) 4202

洛谷P5055 可持久化文艺平衡树 (可持久化treap)

题目链接 文艺平衡树的可持久化版,可以使用treap实现。 作为序列使用的treap相对splay的优点如下: 1.代码短 2.容易实现可持久化 3.边界处理方便(splay常常需要在左右两端加上保护结点以防越界,而treap一般不用) 可以分裂合并的treap一般称作无旋treap或FHQ-treap,不过我个人觉得它的结构和普通的treap没什么两样,只是多了个分裂和合并的操作而已...

weixin_30821731的博客 237
上一篇: UvaLive 5031 Graph and Queries 平衡树+并查集+离线处理+树合并
下一篇: Codeforces Round #533 C、D
Link_Ray
博客等级 码龄9年 44粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值