![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
Quack_quack
这个作者很懒,什么都没留下…
展开
-
POJ 2887 Big String(块状链表)
先建块状链表,然后插入操作就是把块内元素位置在pos后的全部后移一位,再插入新的元素,如果元素个数大于2000就split 这样写不用merge。。。 find就是先找到块再找到位置输出来#include<iostream>#include<cstring>#include<cstdio>using namespace std;struct blocklist{ struct b原创 2015-12-08 21:32:46 · 600 阅读 · 0 评论 -
splay学习笔记及模板
splay很灵活的,它既可以作为一棵二叉查找树又可以作为一棵区间树,不过不能共存。 因此从两方面来说splay。 一、splay的rotate,splay操作 splay不是特别平衡。不过splay还算是平衡树吧,是有维护平衡的方式的。 splay维护平衡的方式就是提根。查询完了某个节点,就把这个节点提根。这样经过证明每次操作是均摊log(n)的。 提根就是不停旋转,一次旋转,目标节点总可原创 2015-11-22 16:19:09 · 1698 阅读 · 2 评论 -
SBT笔记和模板
一、SBT维护平衡的方式 SBT靠维护size来维护平衡。 对于以r为根的子树,SBT必须满足以下性质: 1.r的左儿子的size大于等于r的右儿子的左右儿子的size 2.r的右儿子的size大于等于r的左儿子的左右儿子的size SBT维护size很简单,就是插入++size,删除–size 维护平衡依靠maintain函数。 具体看论文。我想写这个和AVL的相似的地方。 首先原创 2015-11-19 17:26:29 · 608 阅读 · 0 评论 -
AVL树笔记(一):zig-zag,insert,find,predecessor,successor
AVL树就是一棵平衡的二叉查找树。 其维护平衡的方式是:维护一个平衡因子h,即子树高度,如果左子树高度和右子树高度相差2,那么就旋转把它弄平衡。 旋转是怎么转的这就不细说了,每个PPT都写了。 这个二叉树明显不平衡,可以发现全部左偏,于是右旋。 右旋就是当前节点的左儿子 的 右儿子是当前节点。 如果当前节点有右儿子,怎么办? 那么把这个右儿子拆下来然后装在当前节点的左儿子上。 如图原创 2015-11-16 22:35:32 · 2088 阅读 · 0 评论 -
AVL树笔记(二):maintain,delete
先是maintain操作,它可以维护AVLTree的平衡。 有了maintain,AVLTree的insert和delete就可以不马上维护平衡,而是操作完再维护平衡了。void maintain(int &r){ if(tree[tree[r].lc].h==tree[tree[r].rc].h+2) { int t=tree[r].lc; if原创 2015-11-17 22:50:38 · 519 阅读 · 0 评论 -
可持久化线段树笔记
可持久化数据结构主要解决有查询历史版本或者返回历史版本的操作。 可持久化线段树就是一种可持久化数据结构。 最简单的可持久化线段树的方法是对于不同的时间,都建一棵新线段树,当前时刻的线段树可以由前一时刻复制来,然后在当前时刻的线段树上面进行修改。 然而这样的可持久化线段树非常耗费内存,有一种感性的想法,就是如果当前时刻的线段树和前一时刻的线段树有共用的节点,这样这些节点就可以不用复制,直接把要修原创 2015-11-28 20:59:29 · 4212 阅读 · 2 评论 -
BZOJ3224普通平衡树splay,SBT代码
splay#include<iostream>#include<cstdio>#include<cstring>using namespace std;int v[100010],fa[100010],ch[100010][2],sz[100010],tot[100010],rt,n,op,x,cnt,pred,succ;char c;inline void GET(int &n){原创 2015-11-22 16:22:45 · 598 阅读 · 0 评论 -
POJ 3580 SuperMemo(区间树)
唯一一个要说的就是REVOLVE操作。别的在笔记上有。 可以发现REVOLVE就是把一段区间砍下来然后接在一个点后面。 那么先把这个区间砍下来(rotateto(l-1,0)rotateto(r+1,root)),然后pushup,然后找到那个点(rotateto(x,0)rotateto(x+1,root)),然后插入回去。最后pushup。#include<iostream>#includ原创 2015-11-22 16:28:22 · 585 阅读 · 0 评论 -
lct模板
from popoqqq 指针版 BZOJ 2049洞穴勘测#include<cstdio>#include<algorithm>using namespace std;struct node{ node *fa,*lc,*rc; bool rev; node(); void pushdown();}*null=new node,tree[10010];n原创 2015-12-08 22:17:34 · 1110 阅读 · 0 评论