【模板】最近公共祖先(LCA)倍增
P3379
P3379 【模板】最近公共祖先(LCA)
# 【模板】最近公共祖先(LCA)
## 题目描述
如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。
## 输入格式
第一行包含三个正整数 $N,M,S$,分别表示树的结点个数、询问的个数和树根结点的序号。
接下来 $N-1$ 行每行包含两个正整数 $x, y$,表示 $x$ 结点和 $y$ 结点之间有一条直接连接的边(数据保证可以构成树)。
接下来 $M$ 行每行包含两个正整数 $a, b$,表示询问 $a$ 结点和 $b$ 结点的最近公共祖先。
## 输出格式
输出包含 $M$ 行,每行包含一个正整数,依次为每一个询问的结果。
## 样例 #1
### 样例输入 #1
```
5 5 4
3 1
2 4
5 1
1 4
2 4
3 2
3 5
1 2
4 5
```
### 样例输出 #1
```
4
4
1
4
4
```
## 提示
对于 $30\%$ 的数据,$N\leq 10$,$M\leq 10$。
对于 $70\%$ 的数据,$N\leq 10000$,$M\leq 10000$。
对于 $100\%$ 的数据,$1 \leq N,M\leq 500000$,$1 \leq x, y,a ,b \leq N$,**不保证** $a \neq b$。
样例说明:
该树结构如下:

第一次询问:$2, 4$ 的最近公共祖先,故为 $4$。
第二次询问:$3, 2$ 的最近公共祖先,故为 $4$。
第三次询问:$3, 5$ 的最近公共祖先,故为 $1$。
第四次询问:$1, 2$ 的最近公共祖先,故为 $4$。
第五次询问:$4, 5$ 的最近公共祖先,故为 $4$。
故输出依次为 $4, 4, 1, 4, 4$。
2021/10/4 数据更新 @fstqwq:应要求加了两组数据卡掉了暴力跳。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,L=19;
int n,m,s,f[N][20],head[N],k,dep[N],lo[N];
struct ed{int to,next;
}e[2*N];
void add(int x,int y){e[++k].to=y;e[k].next=head[x];head[x]=k;
}
void dfs(int x,int fa){f[x][0]=fa;dep[x]=dep[fa]+1;for(int i=1;i<=19;i++)f[x][i]=f[f[x][i-1]][i-1];for(int i=head[x];i!=0;i=e[i].next){int to=e[i].to;if(to!=fa)dfs(e[i].to,x);}
}
int lca(int x,int y){if(dep[x]<dep[y])swap(x,y);while(dep[x]>dep[y]){x=f[x][lo[dep[x]-dep[y]]];//printf("oO%d,%d,%d\n",f[x][lo[dep[x]-dep[y]]],x,y);}if(x==y) return x;for(int i=19;i>=0;i--){if(f[x][i]!=f[y][i]){x=f[x][i];y=f[y][i];}}return f[y][0];
}
int main(){//printf("%d",log(1));//memset(head,-1,sizeof(head));scanf("%d%d%d",&n,&m,&s);for(int i=2;i<=N;i++){lo[i]=lo[i/2]+1;}for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);add(x,y);add(y,x);}dfs(s,0);//for(int i=1;i<=n;i++)printf("%d ",dep[i]);while(m--){int x,y;scanf("%d%d",&x,&y);printf("%d\n",lca(x,y));}
}
/*
5 5 4
3 1
2 4
5 1
1 4
2 4
4 2
3 4
4 2
4 5
*/
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10,L=19;
int n,m,s,fa[N],head[N],k,dep[N],lo[N],ans[N];
bool vis[N];
vector<int> e[N];
vector<pair<int,int> > q[N];
int find(int x){if(fa[x]==x)return x;return fa[x]=find(fa[x]);
}
void dfs(int x){fa[x]=x;vis[x]=1;for(int i=0;i<e[x].size();i++){int to=e[x][i];if(!vis[to]){dfs(to);fa[to]=x;}}for(int i=0;i<q[x].size();i++){int c=q[x][i].first,cc=q[x][i].second;if(vis[c]){ans[cc]=find(c);}}
}
int main(){//printf("%d",log(1));//memset(head,-1,sizeof(head));scanf("%d%d%d",&n,&m,&s);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);e[x].push_back(y);e[y].push_back(x);}//for(int i=1;i<=n;i++)printf("%d ",dep[i]);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);q[x].push_back((pair<int,int>){y,i});q[y].push_back((pair<int,int>){x,i});}vis[0]=1;dfs(s);for(int i=1;i<=m;i++){printf("%d\n",ans[i]);}
}
/*
5 5 4
3 1
2 4
5 1
1 4
2 4
4 2
3 3
2 2
4 5
*/
相关文章:
【模板】最近公共祖先(LCA)倍增
P3379 P3379 【模板】最近公共祖先(LCA) # 【模板】最近公共祖先(LCA) ## 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。 ## 输入格式 第一行包含三个正整数 $N,M,S$&#…...
我的JAVA项目构建
1.Maven maven就是pip 设置maven下载的的jar包位置 换源 下载插件maven-search 配置dependency 2.Tomcat 设置环境变量JAVA_HOME 设置编码方式 方框就是路径的前缀 3.Servlet 新建项目 写一个类继承HttpServlet,复写doGet(应对Get请求),doPost(应对…...
应用层协议 序列化
自定义应用层协议 例子:网络版本计算器 序列化反序列化 序列化:将消息,昵称,日期整合成消息-昵称-日期 反序列化:消息-昵称-日期->消息,昵称,日期 在序列化中,定义一个结构体…...
【HAD】Half-Truth: A Partially Fake Audio Detection Dataset
文章目录 Half-Truth: A Partially Fake Audio Detection Dataset背景key points研究数据集设计评价指标实验基线:utterance-level分类(话语级)基线:segment-level分类(片段级)Half-Truth: A Partially Fake Audio Detection Dataset 会议/期刊:Interspeech 2021 CCF-C…...
OpenAI Prompt generation - 生成和优化Prompt的Prompt
OpenAI Prompt generation - 生成和优化Prompt的Prompt 从头开始创建 Prompt 可能很耗时,所以快速生成 Prompt 可以帮助我们提高效率。 下面是 OpenAI 提供的协助生成 Prompt 的 Prompt。 from openai import OpenAIclient OpenAI()META_PROMPT ""&qu…...
Android技术探索:深入解析Android组件
Android系统以其开放性和多样性,成为了众多开发者的首选平台。在Android应用的开发中,组件(Components)是构建应用的基础元素。深入了解Android组件,对于开发者来说至关重要。本文将详细探讨Android的四大核心组件&…...
使用R-GCN处理异质图ACM的demo
加载和处理数据集 import torch from torch_geometric.datasets import HGBDataset from torch_geometric.transforms import RandomLinkSplit# 加载ACM数据集,这是一个包含论文(paper)、主题(subject)以及它们之间关…...
征程 6E DISPLAY 功能介绍及上手实践
01 功能概述 本文将带大家一起实现单路、多路 MIPI CSI TX 输出、IDU 回写、IDU oneshot 模式、绑定输出 VPS 数据等功能,此处主要介绍各 sample 的实现与使用方法。 02 软件架构说明 本文中绑定 VPS 输出功能基于 libvio API 实现,调用 libvio 提供的…...
安卓窗口wms/input小知识NO_INPUT_CHANNEL剖析
背景: 经常在学员的vip技术群里经常有很多学员会提问一些不太常见的窗口和input的相关的问题,虽然不太常见,但确实是工作中会遇到的一些问题,所以马哥有必要进行一下记录这些窗口技术知识点。 具体分享技术点: input中…...
【2024最新版】Win10下 Java环境变量配置----适合入门小白
首先,你应该已经安装了 Java 的 JDK 了(如果没有安装JDK,请跳转到此网址:http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html) 笔者安装的是 jdk-8u91-windows-x64 接下来主要讲怎么配…...
Servlet 生命周期详解及案例演示(SpringMVC底层实现)
文章目录 什么是Servlet?Servlet生命周期简介1. 初始化阶段:init()方法示例代码: 2. 请求处理阶段:service() 和 doGet()、doPost()方法示例代码: 3. 销毁阶段:destroy()方法示例代码: Servlet生…...
2024 kali系统2024版本,可视化界面汉化教程(需要命令行更改),英文版切换为中文版,基于Debian创建的kali虚拟机
我的界面如下所示 1. 安装 locales sudo apt install locales 2. 生成中文语言环境 sudo locale-gen zh_CN.UTF-8 如果你希望安装繁体中文,可以加入: sudo locale-gen zh_TW.UTF-8 3. 修改 /etc/default/locale 文件 确保有以下内容 LANGzh_CN.UT…...
深入理解 CMake 中的 INCLUDE_DIRECTORIES 与 target_include_directories
在使用 CMake 构建系统时,指定头文件的包含路径是非常常见的一步。对于这个任务,CMake 提供了两种主要的命令:INCLUDE_DIRECTORIES 和 target_include_directories。虽然它们看似类似,但它们的作用范围、应用方式以及适用场景却有…...
【不知道原因的问题】java.lang.AbstractMethodError
项目场景: 提示:这里简述项目相关背景: 遇到了一个问题: java.lang.AbstractMethodError 问题描述 提示:这里描述项目中遇到的问题: 在Java开发中,java.lang.AbstractMethodError是一个常见…...
分布式篇(分布式事务)(持续更新迭代)
一、事务 1. 什么是事务 2. 事务目的 3. 事务的流程 4. 事务四大特性 原子性(Atomicity) 一致性(Consistency) 持久性(Durability) 隔离性(Isolation) 5. MySQL VS Oracle …...
[Linux] 逐层深入理解文件系统 (2)—— 文件重定向
标题:[Linux] 逐层深入理解文件系统 (2)—— 文件重定向 个人主页水墨不写bug (图片来源于网络) 目录 一、文件的读取和写入 二、文件重定向的本质 1.手动模拟重定向的过程——把标准输出重定向到redir.txt 2.重定向…...
html+css+js实现Badge 标记
实现效果: 代码实现: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Badge…...
纯css 轮播图片,鼠标移入暂停 移除继续
核心 滚动: animation: 动画名称 20s linear infinite normal;停止: animation: 动画名称 20s linear infinite paused; 完整例子: html: <div class"carousel-wrapper"><div class"carousel"><div cl…...
iOS GCD的基本使用
一:什么是GCD GCD的全程是:Grand Central Dispatch, 直白的用汉语翻译就是:厉害的中枢调度器. GCD 是iOS 的多线程技术的实现方案,但是它并不是多线程技术,它是“并发解决技术”,是苹果公司研发的,会自动管理线程(这一段定义有点拗口,简单了解就行) GCD会自动管理线程的生命…...
如何设计开发RTSP直播播放器?
技术背景 我们在对接RTSP直播播放器相关技术诉求的时候,好多开发者,除了选用成熟的RTSP播放器外,还想知其然知其所以然,对RTSP播放器的整体开发有个基础的了解,方便方案之作和技术延伸。本文抛砖引玉,做个…...
AI:词向量模型详解(Word Embedding)
词向量模型详解(Word Embedding) 词向量(Word Embedding)是自然语言处理(NLP)中最基础且影响深远的表示学习方法之一。它将离散的词汇映射为低维、稠密的实数向量,使计算机能够“理解”词语之间…...
kotlin协程取消执行
取消启动协程的整个scope,该scope下面的所有协程都会被取消。协程内部是通过抛出一个特殊的异常来实现取消的:CancellationException。如果想在取消时传递取消的原因,可以在调用cancel时主动提供一个CancellationException的实例:…...
开发者利器:OpenClaw+Qwen3.5-9B-AWQ-4bit自动生成UI设计文档
开发者利器:OpenClawQwen3.5-9B-AWQ-4bit自动生成UI设计文档 1. 为什么我们需要自动化设计文档 作为一名长期奋战在一线的开发者,我深知设计交接环节的痛点。每次收到Figma设计稿后,手动整理设计规范、提取颜色代码、记录组件结构要耗费数小…...
OpenClaw安全实践:Qwen3.5-9B本地化处理敏感数据
OpenClaw安全实践:Qwen3.5-9B本地化处理敏感数据 1. 为什么金融从业者需要本地化AI助手 上个月我帮一位在投行工作的朋友分析季度财报时,遇到了一个典型困境:他们需要从上百页PDF中提取关键财务指标,但公司禁止使用任何第三方云…...
Phi-4-mini-reasoning企业知识图谱增强:实体关系推理与逻辑补全案例
Phi-4-mini-reasoning企业知识图谱增强:实体关系推理与逻辑补全案例 1. 模型简介与核心能力 Phi-4-mini-reasoning 是一个基于合成数据构建的轻量级开源模型,专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员,它特别强化了数…...
是德N5771A直流电源/keysight N5771A
是德N5771A直流电源/keysight N5771A 是德N5771A 探头是一款 直流电源 ,主要特点包括: 输出额定值:电压为300伏,电流为5安培,功率为1500瓦 接口标准:支持 GPIB 、 LAN 、 USB 接口࿰…...
代码审计 | Log4j2 —— CVE-2021-44228 JNDI 注入与递归解析的完整链路分析
代码审计 | Log4j2 —— CVE-2021-44228 JNDI 注入与递归解析的完整链路分析 目录 环境搭建 漏洞复现 编写测试代码 构造恶意 class 文件 启动 LDAP 转发器 请求流程 使用 JNDI 工具一键利用 代码审计 payload 入口追踪 MessagePatternConverter:关键转折点 substitu…...
SEATA分布式事务——AT模式一
简介 AI Agent 不仅仅是一个能聊天的机器人(如普通的 ChatGPT),而是一个能够感知环境、进行推理、自主决策并调用工具来完成特定任务的智能系统,更够完成更为复杂的AI场景需求。 AI Agent 功能 根据查阅的资料,agent的…...
I2C总线原理与应用实战指南
1. I2C总线基础概念解析I2C(Inter-Integrated Circuit)总线是飞利浦半导体(现NXP)在1980年代开发的一种同步、多主从架构的串行通信总线。作为一名嵌入式工程师,我几乎在每个项目中都会用到这个看似简单却功能强大的两…...
零基础玩转OpenClaw:Qwen2.5-VL-7B多模态模型入门指南
零基础玩转OpenClaw:Qwen2.5-VL-7B多模态模型入门指南 1. 为什么选择OpenClawQwen2.5-VL组合 去年夏天,当我第一次看到同事用自然语言指令让AI自动整理会议纪要时,内心受到了巨大冲击。经过两周的折腾,我终于在自己的MacBook上搭…...
