线段树是一个树形数据结构。 满二叉树; 倍增的思想,分治的手法; 点/区间进行查询/修改; 常考,码量大。 【线段树的设计】 为了满足线段树满二叉树的定义,我们先把数组补成 2的幂 个。 补充的数肯定不能影响我们的计算,于是我们把它们设成单位元。 记n为补充后的元素个数。 我们让这n个元素组成线段树的叶结...
树链剖分(线段树) 树链剖分是将一棵树分成几条链,把树形变为线性以减少处理难度。 对于轻重链剖分,每个非叶子节点的儿子中儿子数量最多的那个儿子为重儿子,其余所有儿子为轻儿子。 重边指连接两个重儿子的边,其余的边为轻边。 重链指相邻重边连起来的一条重儿子的链。 每一条重链以轻儿子为起点。 dfs序...
4,两遍dfs就是树链剖分的主要处理,通过dfs我们已经保证一条重链上各个节点dfs序连续,那么可以想到,我们可以通过数据结构(以线段树为例)来维护一条重链的信息 回顾上文的那个题目,修改和查询操作原理是类似的,以查询操作为例,其实就是个LCA,不过这里使用了top来进行加速,因为top可以直接跳转到该重链的起始...
接下来M行每行包含若干个正整数,每行表示一个操作。 题解:将这棵树剖为树链,在链上跑线段树,注意点太多,就不说了。。。 代码如下 #include<bits/stdc++.h>usingnamespacestd; typedeflonglongll;constintmaxn=(1e5)+5; ll a[maxn],tree[maxn*4],lazy[maxn*4]={0}; ll N,M,R,modd;voidbuild...
根据w[]序列创建线段树,如下图所示。 查询节点u到v路径上节点权值的最值与和值的方法如下。 若u和v在同一条重链上,则在线段树上查询其对应的下标区间[id[u],id[v]]即可。 若u和v不在同一条重链上,则一边查询,一边将u和v向同一条重链上移,然后采用上面的方法处理。对于顶端节点深度大的节点...
“在一棵树上进行路径的修改、求极值、求和”乍一看只要线段树就能轻松解决,实际上,仅凭线段树是不能搞定它的。我们需要用到一种貌似高级的复杂算法——树链剖分。 树链剖分是把一棵树分割成若干条链,以便于维护信息的一种方法,其中最常用的是重链剖分(Heavy Path Decomposition,重路径分解),所以一般提到树链剖...
E. Vasya and a Tree(树上主席树or树上可持续化线段树) E. Vasya and a Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Vasya has a tree consisting of nn vertices with root in vert......
一、线段树染色段操作(复习) 例题:[SDOI2011 第1轮 DAY1] 染色 题意:一棵树,两种操作,将a到b的路径染色为c或者询问a到b路径上颜色段数。 思路:线段树记录当前区间左右端点颜色和线段内颜色段数。这样在由下到上更新的时候color[i]=color[ls]+color[rs]-(rt[ls]==lt[rs])即可,也就是说左儿子右端点...
Tree(树链剖分、线段树) Tree 题意 数据范围 思路 代码 题意 给定一棵节点个数为 n n n的树,每个点都有点权 a i a_i ai。支持两种操作: 一条路径上的所有点权开根号 查询一条路径上的点权和 现在有 m m m个操作 数据范围 1 ≤ n , m ≤ 1 0 5 1 \leq n,m \leq 10^5 1≤n,...