概述: 参考神犇yyb的博客 问题:如何做到\(O(nlogn)-O(1)\)复杂度求解\(k\)次祖先? 常规倍增是\(O(nlogn)-O(logn)\)的,重链剖分是\(O(nlogn)-O(logn)\)的,欧拉序st表能在\(O(nlogn)-O(1)\)复杂度内求两点LCA,但并不能查出k次祖先是谁 长链剖分 方法和树剖十分类似,代码也几乎相同,但我们每
dfs序与树链剖分 本文根据以下视频整理 链接 引子 先看一个题: 已知一棵树,每个节点包含一个权值,你需要设法实现以下操作 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有结点的值加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有结点的值之和 操作3: 格式:
字符串算法 「学习笔记」Manacher 算法 「学习笔记」AC 自动机 图论 「学习笔记」Johnson 全源最短路 「学习笔记」二分图 数据结构 「学习笔记」笛卡尔树 「学习笔记」树链剖分 「学习笔记」莫队算法 动态规划 「学习笔记」数位dp
前置芝士:低复杂度的区间操作算法(线段树等)+dfs+LCA 例题引入:树链剖分模板 题目要求我们对树上的路径和子树进行修改与查询 暴力: 任何算法的优化都是源于暴力, 对于路径的修改,我们可以直接采用LCA求出A和B的公共祖先C,对于(A,C)和(B,C)两条路径进行加和 对于子树的修改,我们可以直接
一.树链剖分的概念 树链剖分是一种对树进行划分的算法,将树划分为若干个链,以便维护树上路径的信息。 也就是说,我们将树划分为若干个线性结构,使用一些数据结构来维护它,如:树状数组,线段树,splay等。 二.树链剖分的作用 前面我们提到,我们将树划分为多个线性结构,用数据结构来维护它,所以
\(n\) 个点, \(m\) 个操作数, 根结点为 \(R\), 取模数为 \(mod\)。 输入一颗树。 支持的操作: 把 \(x\) 点的点权增加(或修改)\(y\)。 将树从 \(x\) 到 \(y\) 结点最短路径上所有节点的值都加上 \(z\)。 询问某个节点 \(x\) 到 \(y\) 节点的路径中所有点的点权和 (或maxn)。 把 \(x\)
PART1(算法思想简介) 1.实现: 2.时间复杂度: 3.特别优势: 4.适用情况: 5.需要注意的点: 6.函数、变量名的解释+英文: 7.dalao分析: 讲得很好 PART2(算法各种类型(并附上代码)) PART3(算法的延伸应用) PART4(对算法深度的理解) PART5(与其相关的有趣题目)
正题 题目链接:https://www.luogu.com.cn/problem/P5305 题目大意 给一棵有根树和\(k\),\(Q\)次询问给出\(x,y\)求 \[\sum_{i=1}^{x}dep_{LCA(i,y)}^k \]\(1\leq n,Q\leq 5\times 10^5,1\leq k\leq 10^9\) 解题思路 和之前\(LCA\)那题一样的思路,如果\(k\)等于\(1\)的话。加入一
题意 题目链接 Sol 首先对询问差分一下,我们就只需要统计\(u, v, lca(u, v), fa[lca(u, v)]\)到根的路径的贡献。 再把每个点与\(k\)的lca的距离差分一下,则只需要统计每个点与\(k\)的lca深度。这个东西等价于所有的链与\(k\)到根的链的并。 树剖+主席树维护一下。这题的主席树需要
这几天学了一个树链剖分,觉得还不是很难,这里我试着讲一讲吧。 首先,我认为树链剖分是把在树上一个节点一个节点的走改为按照某种规则跳,从而降低了时间复杂度。 那这是什么规则呢?首先我们得知道什么是重链,知道什么是重链就得先知道什么是重儿子,重儿子就是子树较大的儿子。然后对于一
在数值模拟中,前期往往通过建模软件等得到三维模型数据,其中包含不同的区域(可作为不同边界)。在 Gmsh 划分网格的过程中,就需要通过几个 *.stl 文件合并后,进行网格划分。下面是一个示例。 Gmsh: merge surface 网格划分 首先,前期得到三部分表面网格(代表实体的不同区域)。分别为 inlet.
考场 \(65+5+0\),并列 rk2 最高分 \(55+10+10\) T1:等比数列可以写作 \(q^kx\),发现 \(q\le1000\) 且有一档分为 \(a_i\le100\),想到 \(2^{60}>10^{18}\),即等比数列的长度最多为 \(59\),这样枚举的区间就从 \(n^2\) 下降到了 \(60n\)。对于每个区间,排序后枚举 \(q\),通过预处理 \(q\) 的
#include<iostream>#include<cmath>using namespace std; struct point { double x; double y;}; double w(int a, int b, int c, point* p) { double d1 = sqrt((p[a].x - p[b].x) * (p[a].x - p[b].x) + (p[a].y - p[b].y) * (p[a].y - p[b].y)); double d2 = s
声明:文中所有观点仅代表个人见解,若有不妥之处欢迎指正。 这篇论文于2018年 被 SCI 1区 "Additive Manufacturing"录用。原文链接:http://hpcg.purdue.edu/bbenes/papers/Demir18AM.pdf 目录 1.Overview 2.Decomposition(剖分) 2.1Search Subspace Creation 创建搜索子空间 2.2Segm
题意 给一棵 n n n 个点的树,有 m m m 次询问,每次询问给出 l
基槽: 优化转移时间复杂度只和深度有关的树形DP 思想: 定义重儿子为深度最大的儿子,每次巧妙地利用数组分配空间的方式(利用dfn序)继承来自重儿子的信息,然后暴力合并亲儿子,均摊时空复杂度\(O(n)\)。 Pf:定义长链为最长的全是由重儿子组成的链,则长链的顶点一定是一个轻儿子,对于每个点,
[C++]树链剖分 预备知识 树的基础知识 关于这个本文有介绍 邻接表存图 线段树基础 会区间加法和区间结合就可以了P3372 建议阅读这篇Blog 最近公共祖先LCA 虽然用不到这个思想 但是有类似的 有助于快速理解代码 建议阅读这篇Blog 算法思想 树链剖分 顾名思义 就是把树
为啥我写的都是模板题题解啊 像这种题就得耐心把式子列出来,写出来也不多。为什么某题解用的普通dsu误导人啊,不用长剖写这题的都是毒瘤。 #include<bits/stdc++.h> using namespace std; #define forg(i,x) for(register int i=fir[x];i;i=nxt[i]) #define uu unsigned #define sca
题目大意 给定一棵 \(n(2\leq n\leq 5000)\) 个点的树,求一共有多少种方案,删去若干条边后,分裂出的所有树的直径都不超过 \(K\),答案模 \(998244353\)。 题解 设 \(dp[u][i]\) 表示把以 \(u\) 为根的子树分裂成若干棵直径不超过 \(K\) 的树,且以 \(u\) 为根的树的高度为 \(i\) 的方案
博客迁移计划14 $ \rightarrow $ 戳我进CF原题 E. Tourists time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard input output: standard output There are $ n $ cities in Cyberland, numbered from $ 1 $ to $ n $ , connected by
传送门 Code #include <bits/stdc++.h> using namespace std; #define RG register int #define LL long long template<typename elemType> inline void Read(elemType& T) { elemType X = 0, w = 0; char ch = 0; while (!isdigit(ch)) { w |= ch ==
原文链接 前置知识 线段树 a n d and and 树上基本操作 定义 几个在树链剖分很重要的概念。 重儿子 对于一个父节点,含有节点数最多的儿
正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1600 题目大意 给出一个字符串\(s\),每次在最后插入一个字符后求它的所有分别子串构出的\(fail\)树的深度和。 \(1\leq Q\leq 10^5\) 解题思路 考虑两个相等的子串长度为\(len\),那么以后面那个子串末尾结尾
题目链接:https://acm.ecnu.edu.cn/contest/354/problem/A/ 原做法:树上倍增+lca,可能生成树的时候复杂度太高,用的是类似并查集的合并方式。 oj上的大佬:https://acm.ecnu.edu.cn/contest/354/submission/2247258/《树链剖分+lca》 先补一个变量vector https://www.runoob.com/
前言 基于UE4/Unity绘制地图基础元素-线(上篇) 基于UE4/Unity绘制地图基础元素-线(下篇) 搞定地图画线之后,接下来就是绘制面和体了: 面作为地图渲染的基本元素之一,在地图中可以代表各种形式的区域,例如海面、绿地等。面数据通常以离散点串形式存储,因此渲染时最关注的是如何将其展现