新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/10/26 7:51:33来源:尧图网络
洛谷P3379 【模板】最近公共祖先(LCA)
输入格式第一行包含三个正整数 ,,分别表示树的结点个数、询问的个数和树根结点的序号。接下来 −1 行每行包含两个正整数 ,表示 结点和 结点之间有一条直接连接的边数据保证可以构成树。接下来 行每行包含两个正整数 ,表示询问 结点和 结点的最近公共祖先。输出格式输出包含 行每行包含一个正整数依次为每一个询问的结果。输入输出样例 #1输入 #15 5 4 3 1 2 4 5 1 1 4 2 4 3 2 3 5 1 2 4 5输出 #14 4 1 4 4说明/提示对于 30% 的数据≤10≤10。对于 70% 的数据≤10000≤10000。对于 100% 的数据1≤,≤5×1051≤,,,≤不保证≠。样例说明该树结构如下第一次询问2,4 的最近公共祖先故为 4。第二次询问3,2 的最近公共祖先故为 4。第三次询问3,5 的最近公共祖先故为 1。第四次询问1,2 的最近公共祖先故为 4。第五次询问4,5 的最近公共祖先故为 4。故输出依次为 4,4,1,4,4。2021/10/4 数据更新 fstqwq应要求加了两组数据卡掉了暴力跳。这题是最近公共祖先(LCA)的标准模板题我们可以预处理出两点上跳的行为定义dp[i][j]:从节点i出发走2^j步能到达的节点那么类似于ST表{lastposdp[i][j-1]dp[i][j]dp[lastpos][j-1]}就是先走2^(j-1)步走到lastpos再从lastpos走2^(j-1)步到达节点dp[lastpos][j-1]总步数2(j-1)2(j-1)2^j起点i终点dp[lastpos][j-1]dp[i][j]所以递推式就是dp[i][j]dp[dp[i][j-1][j-1]还有一点就是我们用dp[i][0]记录i的父亲节点这些都可以用dfs来解决void dfs(int pos,int fa){ deep[pos]deep[fa]1; dp[pos][0]fa; for(auto v:g[pos]){ if(vfa) continue; dfs(v,pos); } } -----再者就是LCA函数先传入两个节点xy确保deepxdeep[y]那么显然的要求y节点先跳上与x节点等高的位置int ddeep[y]-deep[x]; for(int k0;k20;k){ if(dk1) ydp[y][k]; }如果xy说明两者的LCA就是xif(xy) return x;如果x!y:那就一起往上跳注意要从最大的步数开始跳因为从最小步数开始跳的话一旦答案再很高的位置就会浪费很多时间复杂度for(int k20;k0;k--){ if(dp[x][k]!dp[y][k]) //如果发现跳了这么多步还没有公共的节点 xdp[x][k],ydp[y][k]; //直接跳就不用再中间的节点了省时省力 }跳到最后xy都离最近公共祖先差一个位置直接c return dp[x][0](或者c return dp[y][0]一样的)ACcode:#includebits/stdc.h using namespace std; const int N5e55; int n,m,s; int dp[N][25],deep[N]; //fatherdp[i][0]; vectorint g[N]; /* dp[i][j]:从节点i往上跳2^j步达到的节点编号 lastposdp[i][j-1] 先从i跳2^(j-1)步 dp[i][j]dp[lastpos][j-1] 再从lastpos跳2^(j-1)步 所以dp[i][j]dp[dp[i][j-1]][j-1]; */ void dfs(int pos,int fa){ deep[pos]deep[fa]1; dp[pos][0]fa; for(auto v:g[pos]){ if(vfa) continue; dfs(v,pos); } } int LCA(int x,int y){ if(deep[x]deep[y]) swap(x,y); int ddeep[y]-deep[x]; for(int k0;k20;k) if(dk1) ydp[y][k]; if(xy) return x; //倒序先大步跳 for(int k20;k0;k--) if(dp[x][k]!dp[y][k]) xdp[x][k],ydp[y][k]; return dp[x][0]; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cinnms; for(int i1;in-1;i){ int x,y; cinxy; g[x].push_back(y); g[y].push_back(x); } dfs(s,s); for(int j1;j20;j) for(int i1;in;i) dp[i][j]dp[dp[i][j-1]][j-1]; while(m--){ int x,y; cinxy; coutLCA(x,y)endl; } return 0;
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/10/25 3:20:41

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/10/25 3:43:49

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/10/25 4:02:17

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/10/25 5:03:13

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/10/25 3:54:32

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/10/25 5:32:24

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉