随笔分类 - 学习笔记
*【学习笔记】(7) 线段树及高级用法
摘要:一.普通线段树 线段树(Segment Tree)几乎是算法竞赛最常用的数据结构了,它主要用于维护区间信息(要求满足结合律)。与树状数组相比,它可以实现 的区间修改,还可以同时支持多种操作(加、乘),更具通用性。 接下来我们用这道模板题为例,看看线段树是怎么维护区间和这一信息
*【学习笔记】(4) 网络流
摘要:1.算法简介 网络 一个网络 是一张有向图,图中每条有向边 都有一个给定的权值 ,称为边的的容量。特别的,若 , 则 。图中还有两个指定的特殊节点 \(S
【学习笔记】(13) 平衡树——记住不的板子
摘要:Treap Splay 无旋Treap——fhq treap 简介 就是没有旋转操作的 Treap,一些性质什么的都跟 Treap 类似。 算法介绍 (1)merge(x,y) 将两棵“有序”(x中元素的权值最大值小于 y 中元素权值最小值)的Treap合并成一棵。 int ch[N][2], sz
【学习笔记】(29) 笛卡尔树
摘要:定义与性质 笛卡尔树是一种二叉树,每一个结点由一个键值二元组 构成。要求 满足二叉搜索树的性质,而 满足堆的性质。 ,也就是说,对于一个节点 的左儿子 和右儿子 ,一定满足 (下标 \(k
【学习笔记】(28) 基环树
摘要:首先,严格地讲,基环树不是树,它是一张有 个节点、 条边的图。 介绍 无向图上的基环树 有向图上的基环树 内向树 出度为 1 外向树 入度为 1 流程 找到唯一的环; 对环之外的部分按照若干棵树处理; 考虑与环一起计算。 找环 从任意一点开始搜索; 每次拓展到的点涂为灰色,回溯
【学习笔记】(27) 整体 DP
摘要:1.算法简介 整体 DP 就是用线段树合并维护 DP。 有一些问题,通常见于二维的DP,有一维记录当前x的信息,但是这一维过大无法开下,O(nm) 也无法通过。 但是如果发现,对于 x,在第二维的一些区间内,取值都是相同的,并且这样的区间是有限个,就可以批量处理。 所以我们就可以用线段树来维护 DP
【学习笔记】(26) cdq 分治 与 整体二分
摘要:cdq 分治 基本思想 我们要解决一系列问题,这些问题一般包含修改和查询操作,可以把这些问题排成一个序列,用一个区间[L,R]表示。 分。递归处理左边区间 和右边区间 的问题。 治。合并两个子问题,同时考虑到 内的修改对 \([M+1,
* 【学习笔记】(25) 可持久化数据结构
摘要:可持久化线段树(主席树) 主席树,一个数据结构,能访问到历史版本的数据,常用于可持久化和区间k大值,是线段树的一个升级版。 可持久化的意思是可以访问任意版本的数据,一眼想到的暴力做法就是开n个数组来记录,这显然是不可取的。 那么我们考虑优化。若只有单点修改,不难发现每两个版本的差别最多为1,那么我们
【学习笔记】(24) 虚树
摘要:虚树常常被使用在树形dp中,当一次询问仅仅涉及到整颗树中少量结点时,为每次询问都对整棵树进行dp在时间上是不可接受的。此时,我们建立一颗仅仅包含部分关键结点的虚树,将非关键点构成的链简化成边或是剪去,在虚树上进行dp。 虚树包含所有的询问点及它们之间的lca。显然虚树的叶子节点必然是询问点,因此对于
*【学习笔记】(21) Prufer 序列
摘要:## Prufer 序列 Prufer 序列可以将一个带标号 个节点的树用 中的 个整数表示,即 个点的完全图的生成树与长度为 值域为 的数列构成的双射。 Prufer 序列可以方便的解决一类树相关的计数问题,比如凯莱定理:$n
*【学习笔记】(3) 动态DP
摘要:动态 DP 简称 DDP(Dynamic Dynamic Programming),其本质是用 矩阵 维护带修改的动态规划问题。 # 1.算法介绍:树链剖分写法 ## 模板:[P4719 【模板】"动态 DP"&动态树分治](P4719) > 给定一棵 个点的树。 号点的点权为 $a_
【学习笔记】(22) 点分治
摘要:点分治就是把分治搬到了树上,其核心思想仍然是分治:将问题经过处理后,转化为同类型的,规模更小的问题求解。 # 静态点分治 ## Ⅰ.[P3806 【模板】点分治1 ](https://www.luogu.com.cn/problem/P3806) 题意:给定一棵带权无根树,问是否有点对的距离为 $k
*【学习笔记】(10) 块状链表
摘要:# 块状链表(尚未完善) 对于线性表,可以 的访问,但是插入和删除操作是 对于链表,可以 的进行插入和删除,但是是 的访问。 于是本着分块的思想,有了块状链表 。 大概长这个样子。每个块的大小数量级在 , 块数的量级
*【学习笔记】(23) 常用距离算法详解
摘要:本文主要讲述这三种常见距离算法 :欧氏距离,曼哈顿距离,切比雪夫距离 。 ## 1.欧氏距离 **欧氏距离** 是最易于理解的一种距离算法。在数学的平面直角坐标系中,设点 的坐标分别为 ,求点 之间的距离,我们一般会使用如下公式:
*【学习笔记】(19) 启发式合并
摘要:# 启发式合并 启发式合并核心思想就一句话:把小集合的合并到大的里。 启发式合并思想可以放到很多数据结构里,链表、线段树、甚至平衡树都可以。 考虑时间复杂度,设总共有 个元素,由于每次集合的大小至少翻倍,所以至多会合并 次,总的复杂度就是 的(结合线段树合
*【学习笔记】(20) 期望与概率
摘要:# 概率 ## 1.基本概念   长链剖分
摘要:# 长链剖分 ## 1.算法简介与性质 长链剖分本质上就是另外一种链剖分方式。 长链剖分与重链剖分有相通之处,后者是将 子树大小 最大的儿子作为重儿子,前者则是将 子树深度 最大的儿子作为重儿子。可见两者只是换了一个剖分形式。 长链剖分有如下性质: * 性质 1:每个节点所在长链末端为其子树内最深节
好用的bitset——暴力的好帮手
摘要:会持续更新的。 # bitset C++ 的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用 1 bit空间。 bitset的原理大概是将很多数压成一个,从而节省空间和时间, 一般来说bitset会让你的算法复杂度 /32 ## 构造 bi