首页 > 其他分享 >基于dfn序的O(nlogn)-O(1) lca

基于dfn序的O(nlogn)-O(1) lca

时间:2023-10-17 22:23:43浏览次数:29  
标签:std lg int st dfn lca nlogn

\(dfn\)序的长度是欧拉序的一半,常数较小,并且代码便于理解背诵。

让欧拉序求lca成为时代的眼泪。

代码部分实现思路来自cqbz_dongjie

点击查看代码
auto minlca = [&](int x, int y) {
    return (dfn[x] < dfn[y])? x : y;
};
int t = std::__lg(n) + 1;
std::vector <std::vector<int> > st(t + 1);
for (int i = 0; i <= t; i++) st[i].resize(n + 1);
for (int i = 1; i <= n; i++) st[0][dfn[i]] = fa[i];
for (int j = 1; j <= t; j++) {
    for (int i = 1; i <= n; i++) {
        st[j][i] = minlca(st[j - 1][i], st[j - 1][i + (1 << (j - 1))]);
    }
}
auto lca = [&](int x, int y) {
    if (x == y) return x;
    if (dfn[x] > dfn[y]) std::swap(x, y);
    int lg = std::__lg(dfn[y] - dfn[x]);
    return minlca(st[lg][dfn[x] + 1], st[lg][dfn[y] - (1 << lg) + 1]);
};

标签:std,lg,int,st,dfn,lca,nlogn
From: https://www.cnblogs.com/cqbzlzh/p/17770851.html

相关文章

  • LCA学习笔记
    定义最近公共祖先简称LCA(LowestCommonAncestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。求法有多种求法,目前就学习了倍增和dfs序求LCA,等后面学新的了再加上。前置知识:ST表,dfs序。为方便说明,下面全都是求\(x\),\(y\)的LCA,设其为\(z......
  • LCA性质
    https://zhuanlan.zhihu.com/p/6443257001\[LCA(p_1,p_2,p_3...p_n)=LCA(LCA(LCA(p_1,p_2),p_3),...p_n)\]证明略2\[LCA(p_1,p_1,p_2)=LCA(p_1,p_2)\]所以LCA相关可以用ST表维护。......
  • P1967 [NOIP2013 提高组] 货车运输 (生成树,LCA)
    P1967[NOIP2013提高组]货车运输https://www.luogu.com.cn/problem/P1967首先有些边是没用的(比较小的边),比如两个点之间的两条(并行的)路,只有较大的会被走到,小的不会被走,因此可以直接去除小的边,即求最大生成树。接着做求任意两点经过的边的最小值就演变成求树上任意两点的最小树......
  • 6577: 暗的连锁 LCA+树上差分
    描述  Dark是一张无向图,图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark有N–1条主要边,并且Dark的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark还有M条附加边。你的任务是把Dark斩为不连通的两部分。一开始Dark的附加边......
  • 三个主要降维技术对比介绍:PCA, LCA,SVD
    前言 本文将深入研究三种强大的降维技术——主成分分析(PCA)、线性判别分析(LDA)和奇异值分解(SVD)。我们不仅介绍这些方法的基本算法,而且提供各自的优点和缺点。本文转载自DeepHubIMBA作者:IndraneelDuttaBaruah仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专......
  • 三个主要降维技术对比介绍:PCA, LCA,SVD
    随着数据集的规模和复杂性的增长,特征或维度的数量往往变得难以处理,导致计算需求增加,潜在的过拟合和模型可解释性降低。降维技术提供了一种补救方法,它捕获数据中的基本信息,同时丢弃冗余或信息较少的特征。这个过程不仅简化了计算任务,还有助于可视化数据趋势,减轻维度诅咒的风险,并提......
  • 浅谈关于LCA
    prologue本身只会tarjan和倍增法求LCA的,但在发现有一种神奇的\(O(1)\)查询lca的方法,时间优化很明显。mainbody倍增法先讨论倍增法,倍增法求lca是一种很常见普遍的方法,这里直接放代码了,其本身的内核就是让较低点每次都跳$2^k$步,如果跳的比另一个高了,就不跳那......
  • CAD设计软件下载-CorelCAD 2020官网版 各个版本下载
    CorelCAD2014是Corel公司推出的一款强大CAD制图工具,使用CorelCAD,用户可以轻松创建专业的CAD图形,CorelCAD使用DWG格式作为其主要的图形文件格式,最高支持版本为2014的DWG和DXF文件,提供了与全球范围内大量图形软件和建筑软件的兼容性和交换功能;新版本优化了基于功能区的用户......
  • dfs 序 O(nlogn)-O(1) 求 LCA
    学点分树,发现不会询问复杂度\(O(1)\)的LCA。于是被迫递归式学习。我们设\(dfn_i\)表示点\(i\)在dfs过程中第几个被访问到,把点按访问到的顺序排序得到的序列叫dfs序。考虑\(u\)和\(v\)在dfs序上的位置之间的这一段序列有什么。设\(lca(u,v)=x,dfn_u<dfn_v\)。......
  • 6576: 点的距离 倍增LCA
    描述 给定一棵n个点的树,Q个询问,每次询问点x到点y两点之间的距离。 输入 第一行一个正整数n,表示这棵树有n个节点;接下来n−1行,每行两个整数x,y表示x,y之间有一条连边;然后一个整数Q,表示有Q个询问;接下来Q行每行两个整数x,y表示询问x到y的距......