NKOI 2447 最近公共祖先

LCA 转 RMQ算法 【总结】 首先,在你看这个算法之前,要确保你理解了RMQ的 ST 算法。 但是不理解没关系啊,提供通道:  点我 声明:这是方便我以后复习用的,所以总结不是特别详细。 LCA - 最近公共祖先:在有根树中,两个节点u和v的公共祖先中距离最近的那个点。 上图理解: 如图,我们想要求出LCA(4,7),LCA(8,6),LCA(5,8)。 用LCA转R 阅读详情

最近公共祖先

Time Limit:10000MS  Memory Limit:65536K
Total Submit:104 Accepted:91
Case Time Limit:1000MS

Description

给出一棵有N(编号1到N)个节点的有根树,求出指定节点对的最近公共祖先!

对于树中节点x而言,从根节点到达x的这一条路径中经过的所有节点,都称为x的祖先。
如上图所表示的树中, 根节点为8。8、4、10、16都是12的祖先。对于6和12这对节点而言,从6出发往上朝根走和从12出发往上朝根走的两条路径最早交汇的地点是4号节点,因此4号点是6和12的最近公共祖先。
同理,11和9的最近公共祖先是8; 10和3的最近公共祖先是10;2和7的最近公共祖先是4......

Input

第一行,一个整数N。表示树中节点总数
接下来N-1行,每行两个整数x和y,表示x是y的父亲。
接下来一行,一个整数M,表示询问的总数
接下来M行,每行两个整数a和b,表示询问a和b的最近公共祖先。

Output

M行,每行一个整数,表示对应询问的答案。

Sample Input

输入样例1:
16 
1 14
8 5
10 16
5 9
4 6
8 4
4 10
1 13
6 15
10 11
6 7
10 2
16 3
8 1
16 12
3
16 7
14 9
3 10
输入样例2:

5
2 3
3 4
3 1
1 5
2
3 5
4 5

Sample Output

输出样例1:
4
8
10
输出样例2:
3
3

Hint

2<=N<=10000
1<=M<=10000

Source

改编自POJ1330


求有关最近公共祖先的问题可以用LCA来解决,与倍增有关,是比较实用的技巧

树上倍增算法:
Dep[v]记录节点v的深度(层数)
fa[v][k]记录节点v向上第2^k个祖先的编号

fa[v][k]=fa[fa[v][k-1]][k-1];

s为倍增的上限,比如这个树的总层数为8,则s为3(23==8)

然后对于两个不同的节点A,B我们要求他们的公共祖先,首先要用到go_up函数(在本人代码中将其和lca函数合在了一起)使层数较大的一个节点转换到一个层数与另一节点相同的祖先去,下面是代码

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;

const int maxn=10005;
int n,quest,a,b,cnt,depth[maxn],fa[maxn][35],m;
int NEXT[maxn<<1],END[maxn<<1],last[maxn];
bool mark[maxn];

inline void _read(int &x){
    char t=getchar();bool sign=true;
    while(t<'0'||t>'9')
    {if(t=='-')sign=false;t=getchar();}
    for(x=0;t>='0'&&t<='9';t=getchar())x=x*10+t-'0';
    if(!sign)x=-x;
}

void insert(int a,int b){  
    END[++cnt]=b;  
    NEXT[cnt]=last[a];  
    last[a]=cnt;  
}  

void dfs(int v){<span style="font-family:Times New Roman;">//深搜建树</span>
	int i,j,k;
	depth[v]=depth[fa[v][0]]+1;
	k=ceil(log(depth[v])/log(2));//k为当前讨论的两个节点的倍增值<span style="font-family:Times New Roman;">上限</span>
	for(i=1;i<=k;i++)
	    fa[v][i]=fa[fa[v][i-1]][i-1];//递推计算fa数组
	j=last[v];
	while(j){
		dfs(END[j]);
		j=NEXT[j];
	}
}

int lca(int x,int y)
{
	int i,k,s;
	s=ceil(log(n)/log(2));  
	if(depth[x]<depth[y])swap(x,y);
	k=depth[x]-depth[y];
	for(i=0;i<=s;i++)
	    if(k&(1<<i))x=fa[x][i];//go_up操作
	if(x==y)return x;
	s=ceil(log(depth[x])/log(2));
	for(i=s;i>=0;i--)
	    if(fa[x][i]!=fa[y][i]){ x=fa[x][i]; y=fa[y][i]; }
	return fa[x][0];//最终返回公共祖先节点
}

int main(){
	_read(n);
	for(int i=1;i<n;i++){
		_read(a);_read(b);
		insert(a,b);
		fa[b][0]=a;//预处理fa数组
	}
	for(int i=1;i<=n;i++)
	    if(!fa[i][0]){
	    	dfs(i);
	    	break;
	    }
	_read(m);
	for(int i=1;i<=m;i++){
		_read(a);_read(b);
		printf("%d\n",lca(a,b));
	}
}


FPGA中参数化SPI接口设计与Verilog实现 SPI(串行外设接口)作为嵌入式系统的核心通信协议,通过全双工、高速率特性在FPGA与Flash、ADC等外设交互中占据重要地位。参数化设计通过抽象时钟极性、数据位宽等可配置维度,采用分层架构实现硬件复用,显著提升开发效率。Verilog实现需重点处理跨时钟域同步和可配置帧结构,结合AXI总线集成与UVM验证方法学,可构建适应工业控制、物联网网关等场景的高可靠SPI解决方案。 阅读详情

相关推荐

Innovus每日精要 | 用setScanReorderMode优化扫描链,效率翻倍!

在数字后端物理设计的世界里,扫描链优化就像修路一样,既要保证数据流的顺畅,又要尽量减少绕路和资源浪费。它的主要任务是优化扫描链的连接方式,确保数据能快速、安全地流动。无论是多电压域设计、分区设计,还是复杂的逻辑门,它都能帮你搞定。后,你会发现它不仅能帮你节省时间,还能让你的设计更优雅、更高效。下次遇到扫描链问题时,不妨试试这些技巧,说不定你的设计效率会翻倍!,它能帮你搞定扫描链优化的那些事儿,让你的设计更高效、更优雅。接下来,我们看看这个命令的几个关键选项,以及它们的实际用途。扫描链优化看似枯燥,但掌握。

weixin_50820814的博客 1442

最近公共祖先

Description 给出一棵有N(编号1到N)个节点的有根树,求出指定节点对的最近公共祖先!    对于树中节点x而言,从根节点到达x的这一条路径中经过的所有节点,都称为x的祖先。  如上图所表示的树中, 根节点为8。8、4、10、16都是12的祖先。对于6和12这对节点而言,从6出发往上朝根走和从12出发往上朝根走的两条路径最早交汇的地点是4号节点,因此4号点是6和12的最近公共祖先

Ciocio 1110

Win本地部署DeepSeek

Ollama 提供了简单的接口,用于创建、运行和管理这些模型,同时还维护了一个丰富的预构建模型库,可以轻松集成到各种应用程序中。重启ollama,具体操作为打开搜索ollama进程,将其结束进程,之后再执行相关模型下载命令即可,或重启电脑!Ollama支持多种DeepSeek模型版本,用户可以根据硬件配置选择合适的模型。配置添加系统环境变量OLLAMA_MODELS,设置其值为新的路径,点击确定应用。安装完成后,在终端输入以下命令,检查Ollama版本。:14B、32B或70B版本,适合高端GPU。

m0_67297673的博客 2391

C++最近公共祖先(LCA版)

C++最近公共祖先(LCA版) 啊呀,这个是我这一个月来听得最懂的一个算法了,真是一个具有纪念意义的时刻。因为我怕我过两天就搞忘了,于是我就只好写这儿了,各位居然大佬爱看不看,(我可真是个秀儿) 大概思路: 用dep[]来标记树的深度,fa[v][k]来标记v点向上2^k 步骤:1.DFS来确定层数,将x,y移到同一水平线; 2.将x,y同时向上移,如果x==y就return x; 不说了,直接看...

CPGhanyue的博客 1360

从SPI到JTAG:玩转FT2232H的MPSSE多协议切换指南(附配置代码)

本文详细介绍了如何利用FT2232H芯片的MPSSE技术实现SPI与JTAG协议的无缝切换,提供配置代码和调试技巧。通过解析MPSSE引擎架构和硬件特性,帮助开发者灵活应对多种串行协议需求,提升嵌入式开发效率。特别适合FPGA调试和物联网设备开发场景。

sun99的博客 254

鱼眼相机矫正实战:除了棋盘格,试试横向展开和经纬度法(OpenCV4/C++实现对比)

本文对比了鱼眼相机矫正的三种主流方法:棋盘格标定法、横向展开法和经纬度法,通过OpenCV4/C++实战代码解析,帮助开发者在自动驾驶、VR全景拼接和安防监控等场景中选择最适合的技术方案。重点分析了各方法的精度、处理速度和适用场景,为工程实践提供实用指导。

weixin_29032489的博客 284

hihoCoder #1069 最近公共祖先·三

#1069 : 最近公共祖先·三 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 上上回说到,小Hi和小Ho使用了Tarjan算法来优化了他们的“最近公共祖先”网站,但是很快这样一个离线算法就出现了问题:如果只有一个人提出了询问,那么小Hi和小Ho很难决定到底是针对这个询...

weixin_30455023的博客 202

YOLO26涨点改进 | 独家创新、损失函数改进篇 | TGRS 2025顶刊 | 带来AIoU小目标涨点损失函数,增强了目标检测中对边界框形状和尺寸的敏感度,适合复杂场景和小物体检测中有效涨点

AIoU损失函数通过自适应形状感知和尺寸敏感加权机制,有效解决了YOLO26原生损失函数在小目标检测中的缺陷。实验结果表明,AIoU损失函数在多个数据集上均取得了显著的性能提升,尤其在小目标检测和多任务场景下表现突出。自适应形状感知,对形状差异较大的目标给予更大惩罚,提高边界框拟合精度尺寸敏感加权,对小目标的宽高比例差异给予更大权重,增强模型对小目标特征的学习能力梯度连续性好,即使在IoU=0时仍能提供有效的梯度更新,解决小目标梯度消失问题。

qq_36130719的博客 159

最近公共祖先 模板 裸题

最近公共祖先 Time Limit:10000MS  Memory Limit:65536K Total Submit:75 Accepted:67  Case Time Limit:1000MS Description 给出一棵有N(编号1到N)个节点的有根树,求出指定节点对的最近公共祖先!    对于树中节点x而言,从根节点到达x的这一条路径中经过的所有节点,都称为x的祖先。

Formiko的博客 672

ChatGPT搭配Claude 4写文献综述效果出奇的好!四步法直接写出逻辑清晰、层次分明的文献综述(附复制即用专业提示词)

请梳理【研究领域】中核心理论的发展演进过程,包括每一阶段理论的核心观点、提出背景与推动力,并指出理论演化中的关键节点或范式转变。请根据以下文献摘要内容,帮助我梳理该主题的研究趋势,包括:常见研究视角、研究方法的演变、研究对象的变化方向等。请根据以下研究空白与我已有的研究基础,帮我生成一个清晰的研究定位,包括:研究主题、研究对象、方法路径和理论框架。先要明确这个研究领域中一个主导或热门的理论,比如社会支持理论、认知负荷理论等,强调这个理论内部的不一致性、适用性争议,通过交代这⼀争议的背景,引发读者兴趣。

智能AI让学术科研更容易 570

RK平台PCIE-Ethernet扩展:Intel I210移植与性能飞升之路

本文详细介绍了Intel I210千兆以太网控制器在瑞芯微RK平台的移植与优化过程。通过硬件适配、内核配置、驱动开发及性能调优四个关键环节,实现了RK平台的网络性能提升。硬件方面,重点说明了PCIE接口的规范连接与供电检查;软件方面,系统阐述了内核配置、设备树修改和驱动编译流程。在性能优化环节,详细介绍了中断优化、缓冲区设置和TCP/IP协议栈调优策略,并采用Iperf和Netperf工具进行量化测试验证。测试结果显示,优化后的网络吞吐量提升20%以上,延迟降低40%,为工业控制、智能安防等场景提供了可靠的

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 352

计蒜客习题:节点的最近公共祖先

问题描述 树是一种很常见的数据结构。现在蒜头君面临一个问题,在一个有 n 个节点的树上,节点编号分别是1…n。蒜头想知道一些节点之间的最近公共祖先是那些节点。 输入格式 第一行输入一个整数 n(2≤n≤10,000),表示树上有 n 个节点。 接下来的 n−1 行,每行输入俩个整数 a,b(1≤a,b≤n)代表节点 a,b 之间有一条 a 到 b 边,a 是 b 的父亲。 接下来...

LiuKairui的博客 1234

用 Custom Entity 打造 RAP Value Help:从能跑到好用的深度踩坑笔记

本文介绍了在RAP项目中实现Value Help(Fiori输入帮助)的完整流程。通过Custom Entity方式,开发者可以灵活构建不依赖数据库实体的值帮助功能,但需手动实现CDS原本提供的过滤、排序、分页等能力。文章以一个典型场景为例,详细说明了如何为Partner维护界面的City字段创建可搜索的值帮助,包括创建查询实现类、绑定CDS Custom Entity、服务发布等关键步骤,并特别指出了处理排序分页请求等常见问题。最后强调在ABAP Cloud环境下需要自行实现查询能力,而非依赖传统工具类。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 140

子树/最近公共祖先

判断一颗二叉树是是否是另一颗树的子树class Solution { public: bool test(TreeNode* T1,TreeNode* T2) { if(T1==NULL && T2==NULL) return true; if(T1==NULL||T2==NULL||T1->val!=T2->val)

草根学僧 429

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

最近公共祖先——解题报告

题目链接:http://132.232.5.128:666/submission/6690 题目大意:给定一棵 n个结点的有根树,结点编号为 1∼n,其中根节点为1号结点。每个结点都对应着一种颜色(黑/白)和一个固定的权值,初始时所有结点的颜色都为白色。现在你需要实现以下两种操作: •Modify v:将结点 v的颜色修改为黑色; •Query v:找到一个黑色结点u,使得结点u和v的最近公共祖先......

风中的微尘的博客 745

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

离线LCA学习

题目1 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中辈分最低的一个是谁。远在美国的他们利用了一些奇妙的技术获得了国内许多人的相关信息,并且搭建了一个小小的网站来应付来自四面

u013268685的专栏(有一种幸福叫AC,有一种期待叫AK) 1379

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

北邮OJ-257- 最近公共祖先-软件14 java

思路分析:思路应该比较简单也很容易想的来,就是比较两个节点的最近的祖先节点,要对每个节点依次记录下他的所有祖先节点,包括其自己,因为自己也算自己的祖先节点,这一点题目中没有明确指出 所以比较坑。 我们可以用一个数组表示某个节点的父节点是谁,在判断的时候顺着数组遍历下去就能达到根节点1,并依次记录下该节点的所有的祖先节点。再与另外一个节点的所有的祖先进行比较。 Problem C. 最近公共祖先...

u010968350的博客 686

『图论』LCA 最近公共祖先

转载记得告诉千千哦~同步更新:https://www.dreamwings.cn/lca/4874.html概述篇LCA (Least Common Ancestors) ,即最近公共祖先,是指这样的一个问题:在一棵有根树中,找出某两个节点 u 和 v 最近的公共祖先。 LCA 可分为在线算法与离线算法 在线算法:指程序可以以序列化的方式一个一个处理输入,也就是说在一开始并不需要知道所有的输入。 离

小坏蛋_千千 4845

数据结构 11-树的概念和术语

目 录1. 树的概念1.1 树的定义1.1.1 树的形式化定义1.1.2 树的递归定义1.2 树的表示法2. 树的术语2.1 节点的度2.2 树的度2.3 分支节点2.4 叶节点2.5 路径和路径长度2.6 节点之间的关系2.6.1 父母节点和孩子节点2.6.2 祖先节点和子孙节点2.6.3 兄弟节点2.7 节点的层次和树的高度3. 森林 树是生活中常见的一种形态,在计算机科学中,树这种数据结构也是非常常见的,它代表着1对多的数据关系。和现实生活中的树不一样,它是倒着的,也就是根节点在上,

一分耕耘一分收获 1913

RMQ-ST 解决在线LCA

#include #include #include #include using namespace std; int L=0, R=999999; int t[1000000]; int s[1000000]; int m[1000000]; // idx of node with min depth in sort-vq[] int d[1000000];

一地鸡毛 1037

NKOI 2090 游戏

【二分图】游戏 Time Limit:10000MS  Memory Limit:65536K Total Submit:38 Accepted:19  Case Time Limit:1000MS Description hy最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示。当他使用某种装备时,他只能使用该装备的某一个属

SuperGate的博客 503

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root =[3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], ...

luxuiary的博客 1161

hihoCoder 1067 最近公共祖先·二

#include using namespace std; map nameMap; string names[100005]; struct node{ int pa; vector son; vector > qu; node() : pa(-1){} }no[100005]; int ans[100005]; int findset(int x){ if(x !=

piaocoder 353

NKOI 1469 通向自由的钥匙(树形dp)

【题意】 通向自由的钥匙 Time Limit:10000MS  Memory Limit:65536K Total Submit:96 Accepted:39  Case Time Limit:1000MS Description 通向自由的钥匙被放n个房间里,这n个房间由n-1条走廊连接。但是每个房间里都有特别的保护魔法,在它的作用下,我无法通过这个房间,也无法取得其中的钥匙。

I good vegetable a! 1279

【算法题归纳合集】图论-最近公共祖先

一、AcWing 1172. 祖孙询问 【题目描述】 给定一棵包含nnn个节点的有根无向树,节点编号互不相同,但不一定是1∼n1\sim n1∼n。 有mmm个询问,每个询问给出了一对节点的编号xxx和yyy,询问xxx与yyy的祖孙关系。 【输入格式】 输入第一行包括一个整数nnn表示节点个数; 接下来nnn行每行一对整数aaa和bbb,表示aaa和bbb之间有一条无向边。如果bbb是−1-1−1,那么aaa就是树的根; 第n+2n+2n+2行是一个整数mmm表示询问个数; 接下来mmm行,每行两个不同的

一只快乐的小蒟蒻~ 614

AcWing 1172. 祖孙询问

题目 给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n。 有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系。 输入格式 输入第一行包括一个整数 表示节点个数; 接下来 n 行每行一对整数 a 和 b,表示 a 和 b 之间有一条无向边。如果 b 是 −1,那么 a 就是树的根; 第 n+2 行是一个整数 m 表示询问个数; 接下来 m 行,每行两个不同的正整数 x 和 y,表示一个询问。 输出格式 对于每一个询问,若 x 是 y 的祖先则输出

萌新的博客 281
上一篇: NKOI 1922 第K小数
下一篇: NKOI 2495 火车运输
SuperGate
博客等级 码龄11年 68粉丝 252原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值