首页 > TAG信息列表 > lca
HDU 5266 pog loves szh III 题解
错误示范:倍增+暴力 开始看到这题时限 6s 本来想着来一发暴力区间倍增 LCA,后来发现是多测之后自然凉凉,准保 T 飞。 然而没有 T,acc 上 RE(ReCoders),HDU WA。 正解:树剖+线段树 维护区间你想到了什么?当然是线段树啊! 分别考虑线段树的 build 和 query 操作。 build:递归,然后 pushup 维护「2021 集训队互测」《关于因为与去年互测zjk撞题而不得不改题这回事》
传送门 思路 一个朴素的想法就是 树剖 + 可持久化 trie 树 但这样是 \(O(qm\log^2 V)\) 的,\(30s\) 跑不过去 但我们注意到,我们每次最多访问到前 \(m\log V\) 大的数 我们就可以考虑将前 \(m\log V\) 大的数取出来,从大到小枚举数位,判断是不是有 \(m\) 个数这一位上为 \(1\),如果有,LCA(最近公共祖先)
lca,即最近公共祖先。最近公共祖先,顾名思义,就是树上两个点最近的祖先。 我们大体上有三个算法来搞。 第一个:\(O(nlogn)\)预处理,\(O(1)\)查询。 大体上是借用了rmq问题的思路(就是区间最大/小值)来处理。 将树上问题转化为区间问题。 void dfs(int rt,int d){ v[rt]=true;num[++t]=rt虚树
一种大树变小树的方法。大概就是只保留题目要求的关键点和其他一些统计答案必须的点,把剩余的所有点从树上砍掉。原理是维护一条最右链(就是我们扫到的最右边的一条链,它左边的虚树已经建好)。 具体的操作: 首先把所有的关键点按照dfs序排序。然后开始分讨: 如果栈空则节点入栈。 找到2022暑假集训新学知识点总结
新学知识点 图论 树 1、树链剖分(求lca,dfs序等) 2、倍增lca 流 1、Dinic 最大流 2、匈牙利 二分图最大匹配 其他 1、spfa最短路判负环 字符串 1、后缀自动机SAM 2、回文自动机PAM 3、manacher(处理回文) 数学 1、线性基(求异或和最大值) 2、卷积ntt(其实不是很会)P2680 [NOIP2015 提高组] 运输计划 【二分+LCA+树上差分】
题目描述 公元 \(2044\) 年,人类进入了宇宙纪元。 L 国有 \(n\) 个星球,还有 \(n-1\) 条双向航道,每条航道建立在两个星球之间,这 \(n-1\) 条航道连通了 L 国的所有星球。 小 P 掌管一家物流公司, 该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 \(u_i\) 号星球沿最快的2022牛客暑假第五场加塞
M-Maimai DX 2077_"蔚来杯"2022牛客暑期多校训练营(加赛) (nowcoder.com) 阅读理解和膜你题。 double pts[5][5]={ {1,1,0.8,0.5,0}, {2,2,1.6,1.0,0}, {3,3,2.4,1.5,0}, {5,5,2.5,2,0}, {1,0.5,0.4,0.3,0} }; int num[4][5]; int sum[4]; double A,B,A0,B0; int main(){ forLCA C 求和 求子树权值和 树上节点单点修改 dfs序+树状数组
链接:https://ac.nowcoder.com/acm/problem/204871 来源:牛客网 题目描述 已知有 nnn 个节点,有 n−1n-1n−1 条边,形成一个树的结构。 给定一个根节点 kkk,每个节点都有一个权值,节点i的权值为 viv_ivi。 给 mmm 个操作,操作有两种类型: 1树上启发式合并(dsu on tree)
DSU on Tree and It's questions 树上启发式合并,可以在 \(O(n\log n)\) 的时间复杂度内解决一类对于子树的查询问题。这篇文章以题目为主。 算法流程 遍历 \(u\) 的所有轻儿子,计算答案,但不保留其在一个全局的数据结构内的结果。 遍历 \(u\) 的重儿子,保留它对一个全局数据结构的影[Google] LeetCode 2096 Step-By-Step Directions From a Binary Tree Node to Another
You are given the root of a binary tree with n nodes. Each node is uniquely assigned a value from 1 to n. You are also given an integer startValue representing the value of the start node s, and a different integer destValue representing the value of the闲话(持续更新)
学习兔爷学 dottle 写闲话。 有点像小时候写日记的感觉,但是不是记录一天干了什么。 内容均来源和 Loxilante 在 qq 或 telegram 上的吹水,绝大多数是自言自语。 虽然放出来了(能让自己坚持写下去),主要是记录给自己,且对选手毫无帮助(不如多切几道题)。 先总LCA学习笔记
简介 LCA(Lowest Common Ancestor) 中文名是最近公共祖先。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。 LCA问题的求解有多种方法,如:倍增、Tarjan、树链剖分 、欧拉序列转化为 RMQ再求解,但我只会倍增。 倍增求LCA: 实现: 我们可以定一个 \(lca[x][k]\) 为表示(未完)【算法学习笔记】04 最近公共祖先LCA
【算法学习笔记】04 最近公共祖先LCA 原理 顾名思义,就是求两点的最近公共祖先(自己也是自己的祖先)。 也就是两点在走到根节点的路径上最先遇到的共同的点。 向上标记法 比较贴定义的原始方法。 一点先向 \(root\) 走,走过的点标记一下;然后另一点也往 \(root\) 走,走到的第一个被标记LCA 相关 && 树链剖分
LCA 基本定义:最近公共祖先简称 LCA(Lowest Common Ancestor)。两个结点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。 简单来讲,就是两个点到根的路径上,深度最深的重合点 常用的求解方法: 朴素方法 每次选择深度较深的那个结点,往上走一步,直到两个结点重合,这个重合点就dfs序 括号序 欧拉序 树上莫队 虚树建立 傻傻分不清
括号序 进加一次,出加一次,显然最后得到的序列只有 \(2n\) 个点。 void dfs(int x) { in[x]=++tot; for(y) dfs(y); out[x]=++tot; } 显然我们希求将树上路径表示为区间,然后用莫队抑或是其它数据结构维护。 对于 \(y\in T_x\) 的情况就是上图,我们发现只要取 \([in_x,in_y]\)最近公共祖先学习笔记
概念 在一棵有根树上,指定点集的最近公共祖先(即 LCA ),就是这些节点的祖先集合的并集中离根最远的点 实现 暴力 先对树进行一次深搜,预处理出每个节点的父亲与深度 对于每一次查询,我们先让深度较大的点向上跳,直到两点深度相同为止 接下来让这两个点一起向上跳,直到这两点相遇为止,此时该P6329 【模板】点分树 | 震波
\(\text{Solution}\) 点分树就是将点分治过程中的重心连成一棵虚树 对点分树子树信息的记录,就是点分治处理每个重心时需要的信息 这样就可以留下点分治的过程,支持多次修改和查询 点分树树高 \(O(log n)\) 且 \(\sum size_x = O(n \log n)\) 可以使用很多暴力的手段 但要注意:点分树"蔚来杯"2022牛客暑期多校训练营3
是我太菜了 加上补提也才三个题 A Ancestor 题目主要是让我们求长度为k-1的点集的最近公共祖先(一个点被删了) 方法一用到结论 我们只用取这些点中dfs序最小和最大的两个点来求最近公共祖先就行。 方法二可以维护一个前缀和后缀lca数组 每次删除该点 相当于是求lca(pre[i-1],suf[i+1LCA(树上倍增)
https://www.luogu.com.cn/problem/P3379 链式前向星存边 fa[i][j] 代表从i结点向上找 2^i 代的父亲,(i=0代表真父亲) dfs从根结点开始fa[now][i] = fa[fa[now][i - 1]][i - 1];代表当前结点的第2^i代父节点是当前结点2^(i-1)父节点的2^(i-1)代父节点,然后再对其连接到的非父结点df"蔚来杯"2022牛客暑期多校训练营3
比赛链接: https://ac.nowcoder.com/acm/contest/33188 A.Ancestor 题意: 已知两棵有 \(n\) 个节点的树 \(A\) 和 \(B\),每个节点都有自己对应的权重,有一个长为 \(k\) 的序列 \(x\),表示树中的关键节点,第 \(i\) 轮删除 \(x_i\) 这个关键节点,问 \(A\) 树中剩余关键节点的最近公共祖先的LCA算法模板
LCA算法简介: 对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。LCA主要是用来处理当两个点仅有唯一一条确定的最短路径时的路径。LCA算法分为离线算法和在线算法离线算法( off line algorithms),是指基于在执行算法前输入数据已树形结构
可持久化线段树可持久化线段树其实就是,在更新后仍然可以保留历史版本。是多棵线段树,但是它们有共同的枝干。 倍增求LCA LCA:两个点的最近公共祖先 首先,先用dfs求出每个点的深度,然后往上跳,直到找到LCA 不过,一个点一个点的往上跳太慢了,可以每次跳2^k步,不断枚举k,直到两个点 的深度LCA在线算法(树状倍增)
对于一棵树里的任意两个节点,若他们的深度相同,显然他们到最近公共祖先的距离是相同的,我 们可以利用这个性质来求最近公共祖先。 对于两个深度相同的节点,若此时父亲节点是同一个点,那么最近公共祖先就是父亲节点,如果不 是的话我们就让他们向上跳到自己的父亲节点,再判断他们的2022杭电第二场多校 Static Query on Tree
Problem - 7150 Static Query on Tree 题意: 给定一棵以1为根的有向树,\(q\) 次询问,每次询问给出三个集合 \(A,B,C\) 问树中满足都可以由集合 \(A, B\) 中各自至少一个点走到的,自身也可以走到 \(C\) 集合中至少一个点的点的个数。 有一个比较显然的树链剖分写法,这里说的是虚树写法,其2022牛客暑期多校训练营3-A.Ancestor(LCA)
题目传送门:https://ac.nowcoder.com/acm/contest/33188/A 题意: • 给出两棵编号 1-n 的树 A B , A B 树上每个节点均有一个权值,给出 k 个关键点的编号,问有多 少种方案使得去掉恰好一个关键点使得剩余关键点在树 A 上 LCA 的权值大于树 B 上 LCA 的权值。 思路:预处理出关键点序列的