----------数据结构----------
文章平均质量分 59
linkfqy
A link to FQY.
展开
-
主席树/函数式线段树/可持久化线段树
【前言】主席树、函数式线段树、可持久化线段树 这三者其实是一个东西…… 它的作用十分显然,就是访问线段树的历史版本……【实现】假设我们要对线段树进行Q次插入操作,如何(随机)访问第i次操作后的线段树?我们当然可以对每个状态都造一棵完整的线段树,但是显然会MLE啊,怎么办? 观察可以发现,线段树的插入操作每次只会更新logN个节点,其他节点都不会变 于是我们可以利用前一次操作的状态,避免重复构原创 2017-04-15 11:10:41 · 2416 阅读 · 1 评论 -
Treap-总结
【前(fei)言(hua)】对于BST,相信大家都很熟悉了。BST系列的数据结构功能都比较强大,但是朴素BST的效率实在不敢恭维,非常容易被卡。今天介绍的Treap是BST的加强版,可以有效防止被卡。【Treap的性质】BST为什么这么容易卡呢?究其原因,其实是BST不太平衡导致的。所谓平衡,就是要让BST的左右两棵子树深度尽量相同,这样在操作时就不会往下查找过多的次数。 于是,我们可以在Tree原创 2017-03-05 15:45:22 · 1648 阅读 · 1 评论 -
左偏树-总结
【左偏树】左偏树是一种可并堆,也是一种优先队列容器。它除了支持查找最小值、删除最小值、插入值外,还支持优先队列不必需的合并(merge)操作。且左偏树的编程复杂度低,效率较高,适合竞赛中使用。【左偏树的性质】我们一般以存二叉树的方法来描述左偏树:对于每个节点,记录其左右儿子(无儿子的指向空节点0),这个节点的键值,以及节点的距离(距离的定义下面会讲)。struct node{ int l,r原创 2017-02-15 21:15:18 · 1765 阅读 · 1 评论 -
树状数组区间修改+查询
【前言】树状数组可以处理单点修改,区间求和的操作,这里就不再赘述了。现在,我们要考虑用树状数组实现区间加,区间求和的操作。由于树状数组常数较小,代码简短,可以在一些场合代替线段树。【实现】首先明确一下,query(c,i)表示求c数组的前缀和。定义要维护的序列为a[],对a[]进行一次差分,得到c[]。 即c[i]=a[i]-a[i-1],显然c[1]+c[2]+……+c[i]=a[i]如何维护c原创 2017-04-07 18:20:39 · 907 阅读 · 1 评论 -
Splay-总结
【前言】Splay Tree,又名伸展树,是OI中应用非常广泛的一种数据结构。相比其他BST,Splay的效率还是不错的。我们一般用Splay维护一个序列。【操作】Splay有以下几个基本操作:1.rot旋转 这个不用我多说了,平衡树中很常见的操作2.splay 伸展 splay(x,k)操作的目的是:从子树(子序列)x中找到第k个,并通过旋转的方式,将其弄到子树的根上。 这里就不得不提一下S原创 2017-04-02 13:19:04 · 1185 阅读 · 1 评论 -
非旋转Treap-总结
【前言】 非旋转Treap,又称FHQ_Treap,函数式Treap。由神犇FHQ首先提出(OrzOrzOrz)。由于使用了函数式编程的思想,非旋转Treap可以实现可持久化。 此外,非旋转Treap的大多数操作都基于分裂与合并,所以代码简短精炼,非常适合OIer食用。 【操作】 就讲讲分裂与合并好了……其他都是可以用脚趾头想出来的。分裂(split) 对于一棵Treap,我们把它分为ke原创 2017-04-18 19:58:03 · 2586 阅读 · 1 评论