【笔记】最近公共祖先 - 倍增

news/2026/1/14 2:31:13/文章来源:https://www.cnblogs.com/Seqfrel/p/19343949

最近公共祖先(LCA)

Luogu P3379【模板】最近公共祖先(LCA)

倍增能在 \(\log(n)\) 解决从 \(u\)\(v\) 的路线问题。

我们往上跳,\(f[i][j]\) 表示 \(i\) 节点往上跳 \(2^j\) 步。

\(f[i][0]=father[i]\)

\(f[i][1]=f[f[i][0]][0]\)

\(f[i][2]=f[f[i][1]][1]\)

\(f[i][j]=f[f[i][j-1]][j-1]\)

实现:如果两个点往上跳的点一样就不跳并减半,最后求跳完之后两个节点的父亲。

先大步再小步。

预处理:建树,求每个点深度以及倍增跳步所达到的点。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=5e5+10;
struct Node{int to,nxt;
}e[2*maxn];
int n,m,s,D;
int tot,h[maxn],dep[maxn],fa[maxn][20];
void Add(int u,int v){tot++;e[tot].to=v;e[tot].nxt=h[u];h[u]=tot;
}
void Dfs(int root,int cur,int fath){fa[root][0]=fath;D=max(D,cur);dep[root]=cur;for(int i=1;i<=log(dep[root])/log(2);i++){fa[root][i]=fa[fa[root][i-1]][i-1];}for(int i=h[root];i!=-1;i=e[i].nxt){int v=e[i].to;if(v!=fath) Dfs(v,cur+1,root);}
}
int LCA(int a,int b){if(dep[a]<dep[b]) swap(a,b);for(int i=log(D)/log(2);i>=0;i--){if(dep[fa[a][i]]>=dep[b]) a=fa[a][i];}if(a==b) return a;for(int i=log(D)/log(2);i>=0;i--){if(fa[a][i]!=fa[b][i]){a=fa[a][i];b=fa[b][i];}}return fa[a][0];
}
int main(){memset(h,-1,sizeof(h));scanf("%d%d%d",&n,&m,&s);fa[s][0]=s;for(int i=1;i<=n-1;i++){int x,y;scanf("%d%d",&x,&y);Add(x,y);Add(y,x);}Dfs(s,1,0);for(int i=1;i<=m;i++){int a,b;scanf("%d%d",&a,&b);printf("%d\n",LCA(a,b));}return 0;
}

ybt 1552【例 1】点的距离

随便选一个点当作树根,然后在跳的时候记录跳的步数即可。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+10;
struct Node{int to,nxt;
}e[2*maxn];
int n,m,s,D;
int tot,h[maxn],dep[maxn],fa[maxn][20];
void Add(int u,int v){tot++;e[tot].to=v;e[tot].nxt=h[u];h[u]=tot;
}
void Dfs(int root,int cur,int fath){fa[root][0]=fath;D=max(D,cur);dep[root]=cur;for(int i=1;i<=log(dep[root])/log(2);i++){fa[root][i]=fa[fa[root][i-1]][i-1];}for(int i=h[root];i!=-1;i=e[i].nxt){int v=e[i].to;if(v!=fath) Dfs(v,cur+1,root);}
}
int LCA(int a,int b){int ans=0;if(dep[a]<dep[b]) swap(a,b);for(int i=log(D)/log(2);i>=0;i--){if(dep[fa[a][i]]>=dep[b]){a=fa[a][i];ans+=pow(2,i);} }if(a==b) return ans;for(int i=log(D)/log(2);i>=0;i--){if(fa[a][i]!=fa[b][i]){a=fa[a][i];b=fa[b][i];ans+=2*pow(2,i);}}return ans+2;
}
int main(){memset(h,-1,sizeof(h));scanf("%d",&n);fa[s][0]=s;for(int i=1;i<=n-1;i++){int x,y;scanf("%d%d",&x,&y);Add(x,y);Add(y,x);}scanf("%d",&m);Dfs(1,1,0);for(int i=1;i<=m;i++){int a,b;scanf("%d%d",&a,&b);printf("%d\n",LCA(a,b));}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026大专建筑工程必看!这些证书让你找工作不踩雷!

各位建工专业的同学们&#xff0c;2026年的建筑行业正在经历深刻转型。“大干快上”的时代过去了&#xff0c;现在是拼技术、拼管理、拼合规的时代。作为大专生&#xff0c;我们学历上不占优&#xff0c;但恰恰可以通过实操技能和专业证书&#xff0c;在施工现场打出一片天。今…

这的确很棒

电脑课自由:https://blog.csdn.net/gitblog_00491/article/details/153757144

【笔记】龟速乘与快速幂

龟速乘与快速幂 n&1: 取n的二进制最末位 n>>1: 右移一位,相当于去掉n的二进制最末尾(相当于n/2) n<<1 相当于n*2 if(n%2==1) 可以写成if((n&1)==1)或if(n&1) 位运算比 +-*/ 更快龟速乘 求 …

2025 最新家电维修平台 TOP5 评测!优质家电维修服务商榜单发布,数智化赋能 + 全城覆盖,品质服务重构家庭生活体验 - 全局中转站

随着居民对品质生活需求的提升,家电维修与家政服务已成为家庭生活的刚需。本榜单基于服务覆盖广度、工程师专业度、响应时效、用户满意度四大维度,结合行业服务标准与真实用户反馈,权威解析2025年五大优质服务平台综…

GitLab与DeepSeek协同实现MR自动评审实践指南

GitLab与DeepSeek协同实现MR自动评审实践指南摘要本文详细探讨如何利用GitLab的CI/CD能力与DeepSeek智能引擎相结合&#xff0c;构建自动化代码评审系统。该系统能够在合并请求&#xff08;MR&#xff09;提交时自动执行代码质量分析&#xff0c;生成结构化评审报告并提出优化建…

2025最新家电安装平台TOP5评测!优质家电服务公司深度解析,安装数智化赋能+全国覆盖权威榜单发布,重构家居服务生态 - 全局中转站

随着人们对居家生活品质要求的不断提升,专业、高效的家电安装及相关家居服务成为家庭生活不可或缺的一部分。本榜单基于服务覆盖范围、专业团队素养、技术创新能力、用户口碑反馈四大维度,结合行业大数据及用户实际体…

CF 口胡记录

这里的蓝题。 CF1290B 性质分析,构造 CF1517D 性质分析,DP CF1553E 分析范围,计算交换次数的 trick CF1406D 分析,差分 CF1322B 按位考虑,从结果出发考虑条件范围,双指针 CF1498E 竞赛图上找 scc,套路性质。 CF…

产品经理资源合集

【163课堂-1000075010】微专业 - 极客班产品经理 - 带源码课件 文件大小: 32.5GB内容特色: 极客班微专业体系&#xff0c;32.5GB源码课件全链路拆解适用人群: 想转行/进阶的产品经理、创业者、互联网业务人员核心价值: 从需求到上线&#xff0c;学完即可独立操刀产品并交付代码…

node基础

从node文档里抄了一些东西贴出来&#xff0c;省的每次都找好久&#xff08;node文档的那个目录&#xff0c;我感觉找东西挺费劲的&#xff09; &#xff08;ps:为什么node v25版本的文档里找不到path模块&#xff0c;v24版本的文档里找到了&#xff01;&#xff01;&#xff01…

行测教程资源合集

归墟行测 文件大小: 9.9GB内容特色: 9.9GB行测全套题库视频精讲&#xff0c;夸克秒下适用人群: 国考、省考、事业单位备考者核心价值: 刷题模考解析一站式&#xff0c;提分快下载链接: https://pan.quark.cn/s/201aaf99d2e4 半月谈付费行测申论资料 文件大小: 57.6GB内容特色…

【笔记】二分

二分分为二分查找和二分答案。 二分查找 每次查询或询问的结果:找到,结束; 找不到,答案所在范围缩小一半。如果小了就查找大的那一半,如果大了就查找小的那一半。查找次数为对数级。 前提:序列有序。 二分查找可…

基于心电信号时空特征的QRS波检测算法的Matlab 2022a仿真

基于心电信号时空特征的QRS波检测算法matlab仿真 1.功能介绍 通过提取ECG信号的时空特征&#xff0c;并使用QRS波检测算法提取ECG信号的峰值&#xff0c;并在峰值点标记峰值信息。 2.使用版本 matlab2022a 3.本作品包含内容 项目工程源文件/完整中文注释&#xff0c;程序操作方…

基于springboot的档案数字化管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

2025最新家电维修/家电安装/租房/家政保洁/找房服务推荐——速达优家(微信小程序),一站式解决居家难题,优选平台实力护航 - 全局中转站

在快节奏的现代生活中,人们对居家服务的需求日益多元化,从家电突发故障到日常保洁打理,从新居家电安装到温馨住房寻找,每一项需求都关乎生活品质。2025年,速达优家(微信小程序)凭借覆盖全国的服务网络、超大规模…

B样条曲线根据曲率极值进行分段速度规划的方法介绍

在 B 样条曲线轨迹上&#xff0c;已经找到曲率极值点并划分了段落&#xff0c;也做了 S 型速度规划&#xff0c;但极值点附近和段内仍出现规划速度超过曲率允许值的情况。如何调整&#xff1f;核心思路&#xff1a; “极值点速度合规”只是必要条件&#xff0c;不是充分条件&am…

Flutter Provider 状态管理深度解析与开源鸿蒙 ArkUI 状态管理对比

文章目录Flutter Provider 状态管理深度解析与开源鸿蒙 ArkUI 状态管理对比引言一、Flutter Provider 核心原理1.1 什么是 Provider1.2 Provider 核心组件1.3 Provider 工作流程二、Flutter Provider 实战教程2.1 环境准备2.2 案例&#xff1a;实现一个计数器应用步骤1&#xf…

mysql重装,3306端口占用问题解决

查询到3306被占用的进程号&#xff1a;netstat -aon | findstr :3306进入到任务管理器中找到进程号

揭秘大规模供应链优化:自动化决策系统如何高效运转

本文深入探讨了某中心如何构建并运行全球最大规模的算法决策系统之一,该系统融合了数学优化与机器学习,自动化决定商品采购、库存配置与物流等核心环节,以应对复杂网络挑战并满足日益增长的客户需求。揭秘大规模供应…

2026转行IT,学Python还是Java更好找工作?

2026年转行IT&#xff0c;选择Python还是Java&#xff0c;一般是结合兴趣、行业趋势比较好。1. 行业需求与岗位方向Java&#xff1a;传统企业级开发&#xff1a;银行、金融、电商后端&#xff08;如阿里、京东等&#xff09;广泛使用Java&#xff0c;岗位需求稳定。Android开发…

XTOOL D9S 1-Year Update Service: Keep Your Tool Updated for European/American Vehicles

Problem Identification: The Race to Keep Up with Modern Vehicle Technology In today’s automotive landscape, vehicle technology evolves at an unprecedented pace. From electric vehicles (EVs) and advanc…