整理一些学过的数据结构和算法

匆匆忙忙中学了很多算法,但基本都是打个板子就跑路了,有些算法有个人比较深入和独特的见解,但大部分,只是实现例题的需求,对算法的作用似懂非懂,所以写篇博客整理一下。


无旋平衡树(treap)


高级数据结构:树和堆

可以允许的操作:插入,删除,查询某数排名,查询某排名的树(第K大),求某数的前驱,后驱(X的前一个数或后一个)

特点:使用随机数pri对每一个数划分优先级,实现堆。键值key对每一个数排序,实现树,满足每一个结点的左儿子比他小,右儿子比他大。

核心:分裂与合并(split&merge)


分块


区间信息维护与查询

可以允许的操作:单点更新,区间更新,区间查询

特点:O根号类暴力算法,简单快捷,效率较差

核心:打懒标记add[ ],和区块和sum[ ]


可持久化线段树


可以允许的操作:查询区间内第K小的数


补充:

前置:权值线段树

节点范围是一个区间,节点储存该值域内的元素个数,如图

如此,每加入一个数,就会产生一个新的权值线段树,但都分开存储,占用的空间太大了,于是:

可持久化线段树来喽!

每插入一个节点,新建一个根节点,将改变了的节点重建,其他重复节点沿用。

实例:依次插入{3,1,4,2,3,5,3,4}


树上差分


序列查分(略)

顾名思义:差分

可以允许的操作:统计若干操作后点(边)被使用(经过了)多少次

核心:从S走到T,

sum[s]++;
sum[t]++;
sum[LCA(s,t)]--;
sum[fa[LCA(s,t)][0]]--

经典例题:松鼠的新家洛谷P3258

可持久化字典树(Tire)


解决问题:异或和问题,求最大异或和
思路:每次在字典树中找相反位

前置题目,用字典树解决最大异或和The XOR-longest Path
因为这道题还是比较巧妙,所以说两句,因为开始我也没想出来怎么用字典树。
因为是一棵树,所以两点之间路径长是固定的,以任意一个点为根DFS遍历整棵树,求出根到每个点的路径长f[ ],所以问题变成求两个f[ ]异或值最大,用字典树解决。

可持久化字典树核心操作:插入(insert),查询(query)。
上易懂图
image

image

清晰易懂,我甚至感觉我不需要多讲什么了。


圆方树(仙人掌图)

无向仙人掌图的定义:

任意一条边至多只出现在一条简单回路的无向连通图称为仙人掌。

仙人掌图


Update日志:

2023.3.25第一次更新了三个知识点
2023.5.1第二次更新了可持久化字典树,并移植到博客园上

posted @ 2023-05-01 14:13  alloverzyt  阅读(40)  评论(0编辑  收藏  举报