数据结构学习笔记

左偏树(可并堆)

  定义$dis_x$为$x$节点到最近的叶子节点的距离$+1$,每个节点的左儿子的$dis$比右儿子大,故每个节点的$dis=dis_rson+1$

  核心操作:合并

//小根堆
int merge(int x, int y)//将y并到x的子树内
{
    if (!x || !y) return x | y;
    if (tr[x].val > tr[y].val) swap(x, y);//若y的值比x小则将y作为x的父亲,则交换,使x并到y的子树内
    tr[x].rs = merge(tr[x].rs, y);
    if (tr[tr[x].rs].dis > tr[tr[x].ls].dis) swap(tr[x].rs, tr[x].ls);//若不满足左偏树性质则交换使其满足
    tr[x].dis = tr[tr[x].rs].dis + 1;
    return x;
}

  插入:

  将$y$插入到$x$内$merge(x,y)&

  删除任意节点:

  将该节点的左右子节点合并即可

分块

  基本思想:

  对原数据进行适当划分,并在划分后的每一个块上预处理部分信息,从而较一般的暴力算法取得更优的时间复杂度

  块状数组:

  把一个数组分为几个块,块内信息整体保存,若查询时遇到两边不完整的块直接暴力查询

  块状链表:

  块状链表就是一个链表,每个节点指向一个数组。

  把原来长度为 $n$ 的数组分为$\sqrt{n}$个节点,每个节点对应的数组大小为$\sqrt{n}$

  分裂:

  当一个块大小超过$2*\sqrt{n}$时执行分裂操作,将该块分裂成两个块(暴力删除copy)

  插入或删除的块大小维护:

  一开始就将$\sqrt{n}$设为一个定值,插入和删除时就不用改变块的大小

莫队:

  基础莫队:

  对于一个区间询问问题,若能从$[l,r]$以$O(1)$的复杂度扩展到$[l-1,r],[l+1,r],[l,r-1],[l,r+1]$,则可以在$O(n\sqrt{n})$内求出所有答案

  模板

inline void move(int pos, int sign) 
{
  // update nowAns
}

void solve() 
{
  BLOCK_SIZE = int(ceil(pow(n, 0.5)));
  sort(querys, querys + m);
  for (int i = 0; i < m; ++i) 
  {
    const query &q = querys[i];
    while (l > q.l) move(--l, 1);
    while (r < q.r) move(r++, 1);
    while (l < q.l) move(l++, -1);
    while (r > q.r) move(--r, -1);
    ans[q.id] = nowAns;
  }
}
View Code

  莫队优化:

  奇偶化排序,对于属于奇数块的询问,$r$从大到小排序,对于属于偶数块的区间,$r$按从小到大排序($unit$为块的大小)

struct node 
{
  int l, r, id;
  bool operator<(const node &x) const 
{
    if (l / unit != x.l / unit) return l < x.l;
    if ((l / unit) & 1)
      return r < x.r;  // 注意这里和下面一行不能写小于(大于)等于,否则会出错(详见下面的小细节)
    return r > x.r;
  }
};
View Code

  带修改莫队:

  对于坐标加上一维时间轴,把询问从$[l,r]$变成$[l,r,time]$,从而实现修改

  树上莫队:

  将树的括号序列跑下来做莫队,当$dfs$到$x$节点时,$push_back(x)$,当$dfs$完$x$节点后$pop_back(-x)$

  之后挪动指针时:

  • 新加入的值是$x--->add(x)$
  • 新加入的值是$-x--->del(x)$
  • 新删除的值是$x--->del(x)$
  • 新删除的值是$-x--->add(x)$

树链剖分、LCT:

  树链剖分,LCT学习总结

后缀数组,后缀自动机:

  字符串奇奇怪怪的东西

KDTree:

  分割$k$维数据空间的结构,用于多维空间搜索,下图即为一颗$KDTree$

  详解KDTree_爱冒险的技术宅-CSDN博客_kdtree

 虚树

  将一棵较大的树浓缩关键信息成为一棵小树,该小树称为虚树

  虚树 - OI Wiki (oi-wiki.org)

    

posted on 2021-04-22 21:32  ArrogHie  阅读(73)  评论(0编辑  收藏  举报