[学习笔记]树链剖分(简易版) 及其LCA

树链剖分

先讲解一下一些基础定义(都是在树上)

  • 重儿子: 一个节点中所有儿子中子树大小最大的一个儿子(每个节点最多有一个重儿子)
  • 轻儿子: 一个节点除重儿子外所有的节点
  • 重链: 若干个重儿子组成的链
  • 链顶: 一条链中深度最小的节点

以下图为例子 (红色连续线段为重链)
红色连续线段为重链
对于节点 1 1 1 来说, 子树大小最大的儿子是 2 2 2 , 2 2 2 最大的是 5 5 5 , 5 5 5的所有儿子子树大小一样大, 随机选一个即可
对于节点 3 3 3 来说, 虽然本身是一个轻儿子, 但是它有重儿子 4 4 4 , 所以也能构成一条重链
由此观之, 所有的点都在某条重链上(重链可能是一个点)

现在, 我们可以通过 d f s dfs dfs 求出以任意节点为根的子树大小, 并且通过全部比较找出每个节点的重儿子.
之后再次 d f s dfs dfs , 把重儿子连成一条又一条链, 记录每个节点所在链的链顶, 等会 L C A LCA LCA 要用

//知道原理就自己写吧, 我的码风一言难尽, 学长写了50行, 我写了270行, 删完之后还剩150行
void dfs(int now,int father){for(int x=0;x<g[now].size();x++){node to=g[now][x];if(to.v==father){continue;}fa[to.v]=now;dfs(to.v,now);siz[now]+=siz[to.v];}return;
}void dfss(int now,int father){int num=0,maxn=-1;for(int x=0;x<g[now].size();x++){node to=g[now][x];if(to.v==father){continue;}if(maxn<siz[to.v]){maxn=siz[to.v];num=to.v;}}for(int x=0;x<g[now].size();x++){node to=g[now][x];if(to.v==father){continue;}if(to.v==num){chain_top[to.v]=chain_top[now];}else{chain_top[to.v]=to.v;}}for(int x=0;x<g[now].size();x++){if(g[now][x].v==father){continue;}dfss(g[now][x].v,now);}return;
}

现在树剖完了, 就该 L C A LCA LCA

树链剖分LCA

有两个节点 A , B A,B A,B ,求它们最近公共祖先
L C A LCA LCA 的大致思想就是不断地往上跳, 直到两个节点到根的路径成包含关系时停止. 但是这个往上跳的过程很费时间, 于是我们可以通过某些判断, 让节点往上跳一条重链的长度(如图)
这棵树是挺大的在这里插入图片描述
假设现在我要求 L C A ( 15 , 19 ) LCA(15,19) LCA(15,19) 以下是具体操作步骤

  • 判断当前两个节点的链顶是不是同一个点
  • 若是, 则输出两个点中深度小的那个
  • 若不是, 就让链顶深度最大的那个点往上跳, 跳到链顶的父亲节点
  • 重复上述过程, 直到判断为是

要是没太明白的话就自己手动模拟以下:

int LCA(int a,int b){while(ct[a]!=ct[b]){if(dep[chain_top[a]]>=dep[chain_top[b]]){a=fa[chain_top[a]];}else{b=fa[chain_top[b]];}}if(dep[a]<dep[b]){return a;}else{return b;}
}

个人认为这个比倍增 L C A LCA LCA 好理解

例题

今天晚上更

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143985.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【LabVIEW】事件结构的用法

本篇文章记录我学习LabVIEW的事件结构用法&#xff0c;希望我的分享对你有所帮助&#xff01; 目录 一、案例说明 1、 LabVIEW实现“YAXBXC的计算” 2、添加事件结构 一、案例说明 在LabVIEW实现“YAXBXC的计算”的基础上&#xff0c;加上事件结构&#xff0c;实现单击一次按…

分布式锁总结2 - redis实现分布式锁并解决常见问题

目录 1. redis分布式锁 1.1基本原理图示如下 1.2 Redis通过一个lock变量实现一个最简单的分布式锁实现代码&#xff1a; 2 升级简单分布式锁&#xff08;实现原子加锁与安全删锁&#xff09; 2.1 但1中的简单分布式锁存在几个问题&#xff1a; 2.1.1 问题1. 如果加完锁执…

Vue.js魔法书:前端开发者的终极指南----指令篇续篇

​个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一个为了让更多人看见许舒雅的宝贝的小白先生 &#x1f921;个人主页&#xff1a;&#x1f517; 许舒雅的宝贝 &#x1f43c;座右铭&#xff1a;深夜两点半的夜灯依旧闪烁&#xff0c;凌晨四点的闹钟不止你一个。 &am…

计算机网络32——Linux-文件io-2文件系统

1、阻塞和非阻塞 想要将文件以非阻塞方式打开&#xff0c;有两种方式 &#xff08;1&#xff09;需要将文件关闭&#xff0c;再用非阻塞方式打开 &#xff08;2&#xff09;fctnl函数&#xff0c;先获取旧属性&#xff0c;再添加一个新属性 阻塞函数 阻塞函数一直在等待输入…

MATLAB系列09:图形句柄

MATLAB系列09&#xff1a;图形句柄 9. 图形句柄9.1 MATLAB图形系统9.2 对象句柄9.3 对象属性的检测和更改9.3.1 在创建对象时改变对象的属性9.3.2 对象创建后改变对象的属性 9.4 用 set 函数列出可能属性值9.5 自定义数据9.6 对象查找9.7 用鼠标选择对象9.8 位置和单位9.8.1 图…

使用微信小程序唤起导航的常用方式

1.微信内置地图 可以使用小程序的wx.openLocation方法&#xff0c;该方法可以打开微信内置地图&#xff0c;并显示指定的位置坐标。如果用户手机上安装了其他地图应用&#xff0c;可能会出现选择使用哪个地图应用进行导航的提示。 wx.openLocation({latitude: 目标地点纬度,lo…

滑动窗口(7)_串联所有单词的字串

目录 1. 题目链接: 2. 题目描述 : 3. 解法 : 题目解析: 算法思路 : 图解流程: 代码展示 : 结果分析 : 1. 题目链接: OJ链接:串联所有单词的字串 2. 题目描述 : 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 w…

Llama 3.1 Omni:颠覆性的文本与语音双输出模型

你可能听说过不少关于语言模型的进展,但如果告诉你,有一种模型不仅能生成文本,还能同时生成语音,你会不会觉得特别酷?今天咱们就来聊聊一个相当前沿的项目——Llama 3.1 Omni模型。这个模型打破了传统的文字生成边界,直接让文本和语音同时输出,实现了真正的"多模态…

【uni-app】小兔鲜项目-基础架构-请求和上传文件拦截器

注意事项 uni.request 请求封装 请求和上传文件拦截器 uniapp 拦截器&#xff1a; uni.addInterceptor 接口说明&#xff1a;接口文档 实现需求 拼接基础地址设置超时时间添加请求头标识添加 token 参考代码 // src/utils/http.ts// 请求基地址 const baseURL https://pca…

fastadmin 部署后前台会员中心出现404错误

访问前台会员中心出现404错误。 解决&#xff1a;nginx访问站点增加伪静态 location / {if (!-e $request_filename){rewrite ^(.*)$ /index.php?s$1 last; break;} }在phpstydy中增加伪静态&#xff0c;如图&#xff1a;

Renesas R7FA8D1BH (Cortex®-M85)的UART使用介绍

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 FSP配置UART 2.1 配置参数 2.2 UART模块介绍 3 接口函数介绍 3.1 R_SCI_B_UART_Open() 3.2 R_SCI_B_UART_Close() 3.3 R_SCI_B_UART_Read() 3.4 R_SCI_B_UART_Write() 3.5 R_SCI_B_UAR…

Tiny-universe-taks1-LLama3模型原理

LLama3模型原理-学习打卡 大模型相关知识笔记transformersSelf-Attention(自注意力机制)Multi-Head-Attention&#xff08;多头注意力机制&#xff09; LLama梳理 大模型相关知识笔记 transformers 目前市面上主流的大模型算法都给予Transformers架构&#xff0c;如下图所示&…

Spring WebFlux实践与源码解析

Spring WebFlux和Spring MVC区别 如下来自官网Spring MVC和Spring WebFlux技术栈的区别。 可以看到Spring MVC主要是基于Servlet API使用同步阻塞IO架构&#xff0c;每来一个请求都需要启动一个线程进行处理。这种架构对于大量I/O密集型的请求&#xff0c;需要同时启动大量的线…

CTFshow——萌新密码1-4

萌新密码1 53316C6B5A6A42684D3256695A44566A4E47526A4D5459774C5556375A6D49324D32566C4D4449354F4749345A6A526B4F48303D 首先&#xff0c;16进制转字符串 在线字符串/十六进制互相转换—LZL在线工具 (lzltool.cn) S1lkZjBhM2ViZDVjNGRjMTYwLUV7ZmI2M2VlMDI5OGI4ZjRkOH0 发现…

ConflictingBeanDefinitionException | 运行SpringBoot项目时报错bean定义冲突解决方案

具体报错&#xff1a; Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name ‘CommissionMapperImpl’ for bean class [com.xxx.mapper.carrier.CommissionMapperImpl] conflicts with existing, non-co…

OpenAI GPT o1技术报告阅读(2)- 关于模型安全性的测试案例

✨报告阅读&#xff1a;使用大模型来学习推理(Reason) 首先是原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 接下来我们看一个简单的关于模型安全性的测试&#xff0c;当模型被问到一个有风险的话题时&#xff0c;会如何思考并回答用户呢&…

JAVA基础,利用for循环找水仙花个数

public class learn2 {public static void main(String[] args) {int count 0;//定义水仙花的个数for (int i 100; i<999; i){int g i%10;int s i/10%10;int b i/100%10;if (i b*b*b s*s*s g*g*g){count1;System.out.println(i);}}System.out.println("一共有"…

MySQL 中的索引覆盖扫描:加速查询的秘密武器

在 MySQL 数据库的使用中&#xff0c;索引是提高查询性能的重要工具。而索引覆盖扫描&#xff08;Index Covering Scan&#xff09;更是一种能显著提升查询效率的技术。本篇文章我们就来深入了解一下 MySQL 中的索引覆盖扫描是什么。 一、什么是索引覆盖扫描 在 MySQL 中&…

攻防世界——simple_php(NO.GFSJ0485)

目录 基础环境解题过程 基础环境 靶机&#xff1a;xctf 方向&#xff1a;Web 难度&#xff1a;1 解题过程 打开题目 我们可以看到该题目的源码&#xff0c;大概分析一下&#xff1a; 我们需要用GET方式传两个值&#xff0c;分别为a,b。 接下来是第一个if&#xff0c;这里判…

分享几种方式获取免费精致的Live2d模型

文章目录 1、 Live2D官方示例数据集&#xff08;可免费下载&#xff09;2、模之屋3、unity商店4、直接b站搜索5、youtube6、BOOTH完结 1、 Live2D官方示例数据集&#xff08;可免费下载&#xff09; 官方提供了一些 Live2D实例模型给大家下载使用 地址&#xff1a;https://ww…