
树
文章平均质量分 64
树状结构
m0_51303687
取乎其上,得乎其中;取乎其中,得乎其下;取乎其下,则无所得矣。
展开
-
树形DP学习笔记
介绍树形DP的应用,包含例题。原创 2021-12-09 18:48:56 · 261 阅读 · 0 评论 -
学习记录 2021.10.2
如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上x 将某区间每一个数加上x 求出某区间每一个数的和对p取模的结果 很明显这又是一个RMQ的题目,可以用线段树求解。 (以下均假设区间长度为len,原来的和为x) 前提:很明显,如果某一个区间同时加上一个数a,那么整个区间的和变为x+len*a;如果同时乘a,那么和就变为ax。 然而本题有两种修改操作,使用1种懒标记显然是不够的。所以用2种,分别为加法标记addt,乘法标记mult。在有两种标记时,由于标记要下放,所以 必须人为规定两种原创 2021-10-02 15:00:00 · 77 阅读 · 0 评论 -
学习记录 树状数组
如果需要对序列进行以下两种操作: 将某一个数加上 x 求出某区间每一个数的和 朴素方法肯定不行,使用分块可以降低复杂度,但仍然有O(n)O(\sqrt n)O(n),数据非常大的话就不能过。使用线段树是一种不错的方法,但浪费空间且常数大。 分析发现可以去掉线段树中不需要的结点。具体地说,去掉每一个结点的右儿子,这时线段树就被简化为这个样子: 这种数据结构叫树状数组(BIT),下面讨论如何解决上面的两个问题。 例如:要求[1,5]的和,我们可以求上图中4与5两块的和 同样,要求[1,7]的和,我们可以原创 2021-09-28 15:02:46 · 80 阅读 · 0 评论 -
学习记录 线段树懒标记
对线段树进行区间更新时,采用一般方法需要访问区间每一个元素对应的所有叶节点 并逐级向上更新,这一操作的复杂度可以达到O(nlogn)O(nlogn)O(nlogn),比朴素方法还要慢。因此引入懒标记,更新时更新到能包含整个区间的结点时就给那个点打上标记,需要查询时再下传到左右儿子,这样可以显著提升效率。 懒标记讲解 对某个节点的懒标记进行下放时,左右儿子的标记也要更新,并且该节点的标记值要清零,以防重复下放。 用懒标记解决洛谷P3372: #include <cstdio> #include &原创 2021-09-26 14:40:21 · 920 阅读 · 0 评论 -
学习记录 线段树(一)
处理RMQ问题的一个实用的数据结构是线段树,它是一种在每个节点上维护区间信息的二叉搜索树,并且由于不删除结点,平衡性较好,因而能实现高效查找、修改的目的。 线段树的根节点维护整个区间的信息,每个结点的左右儿子分别维护父节点左半部分与右半部分的区间信息。 下面以单点增加值与区间查询最大值为例说明如何利用线段树完成RMQ操作: 为了方便起见,修改与查询均传入每个结点对应的区间。 1.建立:为保险起见,将线段树大小设为四倍的区间大小。 int seg_tree[M*4],num_nodes; //计算有效结点个原创 2021-09-21 16:29:01 · 67 阅读 · 0 评论 -
二叉搜索树 2021.8.6
1. 定义: 二叉搜索树(Binary Search Tree,BST),(又:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 二叉搜索树可定义如下: template<typename T> class Treenode { public: T val; Treenode *left,*right; Treenode原创 2021-08-06 10:22:59 · 80 阅读 · 0 评论