首页 > 其他分享 >P3379 最近公共祖先模板

P3379 最近公共祖先模板

时间:2023-01-30 23:22:20浏览次数:36  
标签:祖先 复杂度 P3379 fa 枚举 公共 模板

顾名思义 就是求两个点的公共祖先

暴力做法就是先维护每个点的父亲 然后枚举

但显然这样的作法查询复杂度是O(n)的 就TLE了(


所以需要用倍增优化:

用f[i][j]表示第i个点 向上跳 \(2^j\) 个父亲得到的点的编号


显然 有f[i][0] = fa[i] :

然后是递推式 不难看出f[i][j]可以看作是i先跳 \(2^j-1\) 格到f[i][j-1] 然后再跳 \(2^j-1\) 格 所以有:

至此 预处理完成 复杂度为O(nlogn)


那么如何查找 x 与 y 的最近公共祖先呢?

首先我们先将较低的那个跳到与另一个深度相同:

注意跳完后可能发生以下情况:

所以当 x 跳完与 y 重合 我们就直接输出:

然后 x 与 y 就能一起往上跳了

我们把 j 从大到小枚举 若 f[x][j] == f[y][j] 就说明跳过头了 :

所以 x 与 y 往上跳的条件即为 f[x][j] != f[y][j] :

当然 最后 x 与 y 会停在离最近公共祖先差一格的位置(因为再往上一格 f[x][j] 就等于 f[y][j] 没法跳)

所以此时输出 f[x][0] ( f[y][0] 一样的 写啥看心情 甚至我感觉其实写 fa[x] 都行 )

查询的复杂度为O(logn)


完整代码如下:



标签:祖先,复杂度,P3379,fa,枚举,公共,模板
From: https://www.cnblogs.com/Steven24/p/17077512.html

相关文章

  • C++ 模板之类模板
    使用类模板,可以事先不确定成员变量的类型,假如我们要写一个先进后出的栈,这个栈既可以放入int,也可以放入long,还可以放入string,那么就需要使用模板技术,否则,类的成员变量将难以......
  • ORACLE BIPUBILSHER EXCEL模板相关问题
    1.BIPublisher介绍OracleBIpublisher,它的前身是oraclexmlpublisher。它是对一数据集(数据集简单说就是一张表)的展现定义多个模板。业务用户可以通过使用通用桌面工具......
  • 压位高精模板
    structbignum{ lldat[150]; bignum(){memset(dat,0,sizeof(dat));dat[0]=1;} voidprint(){ printf("%ld",dat[dat[0]]); for(registerinti=dat[0]-1;i>=1;--i......
  • 微信开放平台之第三方平台开发,模板小程序如何提交?
    大家好,我是悟空码字今天天气晴朗,阳光普照。因为疫情影响,小羊人的增多,街上放眼望去,人烟稀少。楼下除了几个十一二岁的小男孩在玩耍,也没有像往日老人悠闲打牌、小孩嬉戏那般热......
  • 24种设计模式--策略模式(strategy)、模板模式(template)
    @目录第一部分:策略模式1.定义接口:Game2.实现Game接口:2.1DNF2.2LOL3.引用的上下文:4.测试类4.1测试结果:第二部分:模板模式复用策略模式的代码1.定义钩子(抽象类):2.具体实现类......
  • 【模板】ODT | Old Driver Tree | 珂朵莉树
    postedon2021-04-0220:38:49|under学术|source这个东西本身不常用,但是这个维护连续段的写法很常用。标签:暴力、数据结构、std::set#include<set>template<cla......
  • 模板引用
    ref属性访问底层DOM,对元素直接操作,可以给一个ref属性访问模板引用挂载完成后,可以在this.$refs上访问绑定了ref的domv-for的模板引用是一个数组,但不保证相同顺序函数......
  • django 自定义模板标签
    故事的背景比较复杂,框架用的django,后台用的simpleui,当我在往前端嵌入echarts的时候发现自定义标签返回的list里面的单引号进行了自动转义,变成了&#39; 具体可以参考:ht......
  • C++ 设计模式--模板方法Template Method
    1.定义定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。TemplateMethod使得子类可以不改变(复用)一个算法的结构即可重定义(override重写)该算法的某......
  • MybatisUtil 模板类
    由于SqlSessionFactory一般只需要创建一次,因此我们可以创建一个工具类来集中创建SqlSession,这样会更加方便一些:publicclassMybatisUtil{//在类加载时就进行创建......