nowcoder172C 保护 (倍增lca+dfs序+主席树) https://www.nowcoder.com/acm/contest/172/C (sbw大佬太强啦 orz) 先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对于某两个(直上直下的)路径a,b,b的下端点在a的下端点子树中,且b的上端点深度<=a的上端点深度,那么b是覆盖a的。
在 x,y 的所有共公共祖先中,深度最大的一个称为 x,y 的最近公共祖先,记为 LCA(x,y)。 LCA(x,y) 是 x 到根的路径与 y 到根的路径的交汇点,它也是 x 与 y 之间的路径上深度最小的节点。 这里着重介绍树上倍增法求LCA。 树上倍增法是一个很重要的算法。除了求 LCA 之外,它在很多问题中都有广泛...
lca模板 1.树上倍增 #include <queue> #include <cstdio> using namespace std; const int MAXN = 1e5 + 5; const int MAXTEP = 45; int n, m; int depth[MAXN], f[MAXN][MAXTEP]; int len, head[MAXN]; struct edge { int to, next; }e[MAXN * 2]; void add (int, int); void...
通过保留关键点的lca,我们可以尽可能地做到使虚树结构与原树相似,这样便使得我们的转化是有效的。 三、建立过程 1. 初始化 初始化ST表并将关键点按照Dfs序排序。 2. 得到虚树上的点 利用倍增求出排好序过后的关键点相邻两点的LCA,并加入关键点数组中,重新按照Dfs序排序并去重。 容易发现,此时虚树上的所有点都...
inline int lca(int a,int b) { if(dep[a] > dep[b]) swap(a,b); if(dep[a] != dep[b]) { for(int i = logn;i >= 0;--i) if(dep[F[i][b]] >= dep[a]) b = F[i][b]; } if(a == b) return a; for(int i = logn; i >= 0; --i) ...
(2)DFS对树进行分块,标记dfs序,记录每个点的深度(倍增用)。 (3)LCA预处理,以及求LCA的函数。 (4)对m个询问进行排序。 (5)莫队开始搞起。 如何转移(抄别人的): (1)定义S(u,v)为u−v路径上的顶点集合,root表示根节点。 (2)S(u,v)=S(root,u)△S(root,v)△lca(u,v) (△表示集合中的对称...
实现企业碳、组织碳、工序碳、产品碳的精细、快捷、可视化的全生命周期核算。有效管控全产业链各环节碳数据,快速对接碳核查和绿色低碳认证,实现钢铁产品全流程LCA管理。能源集控中心使得工序能耗降低了3%,实现煤气零放散,自发电比例提升5%,带来年化效益近2亿元。
不能用倍增的思想,要用向上标记法来标记路径,下为寻找路径的代码 int lca(int a,int b) { if(deep[a]<=deep[b]) swap(a,b); //找到同一层 v1.push_back(a); while(deep[f[a]]>=deep[b]) a=f[a],v1.push_back(a); //v1.pop_back(); if(a==b) return b; v2.push_back(b)...
C语言作为计算机科学中一种广泛使用的编程语言,其算法集对于编程人员来说至关重要。以下是对C常用算法集的总结介绍: 1. 排序算法:包括冒泡排序、选择排序、插入排序、希尔排序和归并排序。这些算法在C语言中实现简单,是数据预处理的基础。 2. 查找算法:二分查找算法和线性查找算法,适用于有序数组或链表。二分查找...
Tag:最近公共祖先、倍增 题解: 涉及到树上距离,考虑最近公共祖先。 两点的最近距离t=dep[a]+dep[b]-2*dep[lca(a,b)].其中dep为节点深度。 1.a=b:答案是n. 2.t为奇数,答案为0.在(a,b)的最短路径上不存在这样的点,在树上移动时距离差的奇偶性不变 3.t为偶数 ...