P3398 仓鼠找 sugar【题解】

news2025/4/21 15:22:35

这是LCA的一个应用,关于LCA

P3398 仓鼠找 sugar

题目描述

小仓鼠的和他的基(mei)友(zi)sugar 住在地下洞穴中,每个节点的编号为 1 ∼ n 1\sim n 1n。地下洞穴是一个树形结构。这一天小仓鼠打算从从他的卧室( a a a)到餐厅( b b b),而他的基友同时要从他的卧室( c c c)到图书馆( d d d)。他们都会走最短路径。现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友?

小仓鼠那么弱,还要天天被 zzq 大爷虐,请你快来救救他吧!

输入格式

第一行两个正整数 n n n q q q,表示这棵树节点的个数和询问的个数。

接下来 n − 1 n-1 n1 行,每行两个正整数 u u u v v v,表示节点 u u u 到节点 v v v 之间有一条边。

接下来 q q q 行,每行四个正整数 a a a b b b c c c d d d,表示节点编号,也就是一次询问,其意义如上。

输出格式

对于每个询问,如果有公共点,输出大写字母 Y;否则输出N

输入输出样例 #1

输入 #1

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

输出 #1

Y
N
Y
Y
Y

说明/提示

本题时限 1s,内存限制 128M,因新评测机速度较为接近 NOIP 评测机速度,请注意常数问题带来的影响。

20 % 20\% 20% 的数据 n , q ≤ 200 n, q\le200 n,q200

40 % 40\% 40% 的数据 n , q ≤ 2 × 1 0 3 n, q\le 2\times10^3 n,q2×103

70 % 70\% 70% 的数据 n , q ≤ 5 × 1 0 4 n, q\le 5\times10^4 n,q5×104

100 % 100\% 100% 的数据 1 ≤ n , q ≤ 1 0 5 1\le n, q\le10^5 1n,q105

解析

我说白了,我白说了
题意就是求a->b的路径与c->d的路径是否有交叉
这道题就是LCA的应用。怎么应用?诸君请看图(图中出现字母含义与题干相同):

  • 当路径有交点时:
    在这里插入图片描述
    不难发现,路径交点就是LCA(b,c),如果这个点的深度大于LCA(a,b)和LCA(c,d)的话,这个LCA(b,c)点就是交点
  • 当路径没有交点时,我们知道此时的两条路径就是两棵没有交叉点的数,此时若求LCA(b,c)的话得到的就是LCA(LCA(a,b),LCA(c,d))了,这个点的深度显然会比LCA(a,b)和LCA(c,d)小。

于是我们可以通过比较LCA(a,b)、LCA(c,d)、LCA(b,c)的深度来得到答案

当然,谁也确定不了是LCA(a,b)->b与LCA(c,d)->c的路叉了,还是LCA(a,b)->b与LCA(c,d)->d的路叉了,还是LCA(a,b)->a与LCA(c,d)->d的路叉了,还是LCA(a,b)->a与LCA(c,d)->c的路叉了,所以得稍加枚举哦!

代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN=200005;
int n,q;
int deep[MAXN];
vector<pair<int,int> >g[MAXN];
struct EDGE{
	int to,nxt;
}edge[MAXN];
int head[MAXN];
int ans[MAXN*3];
int id;
int tot;
int vis[MAXN];
int fa[MAXN];
void add(int u,int v){
	tot++;
	edge[tot].nxt=head[u];
	edge[tot].to=v;
	head[u]=tot;
}
int find(int x){
	return x==fa[x]?x:fa[x]=find(fa[x]);
}
void ask(int x,int y){
	id++;
	g[x].push_back(make_pair(y,id));
	g[y].push_back(make_pair(x,id));
}
//Tarjan求LCA
void tarjan(int u,int f,int d){
	vis[u]=1;deep[u]=d;
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].to;
		if(v==f) continue;
		tarjan(v,u,d+1);
		fa[v]=u;
	}
	vis[u]=2;
	for(int i=0;i<g[u].size();i++){
		if(vis[g[u][i].first]==2) ans[g[u][i].second]=deep[find(g[u][i].first)];
	}
}
int main(){
	cin>>n>>q;
	int ui,vi,a,b,c,d;
	for(int i=1;i<n;i++){
		cin>>ui>>vi;
		add(ui,vi);
		add(vi,ui);
	}
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
	for(int i=1;i<=q;i++){
		cin>>a>>b>>c>>d;
		ask(a,b);ask(c,d);
		ask(a,d);ask(a,c);ask(b,c);ask(b,d);//枚举四种可能相交的情况
		//由于采用了Tarjan求法,所以在预处理查询时有点麻烦
	}
	tarjan(1,0,1);
	for(int i=1;i<=q*6;i+=6){
		int x1=ans[i];//LCA(a,b)
		int x2=ans[i+1];//LCA(c,d)
		int x3=max(max(ans[i+2],ans[i+3]),max(ans[i+4],ans[i+5]));
		//看看是四种交叉情况中的哪一种。当有交点,最深的就是交点。若没有,即使是最深的也有x1>x3或x2>x3
		if(x1<=x3&&x2<=x3) cout<<"Y"<<endl;
		else cout<<"N"<<endl;
	}
	return 0;
}

码字不易,能给个赞吗O_o?

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

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

相关文章

Android Trace埋点beginSection打tag标签,Kotlin

Android Trace埋点beginSection打tag标签&#xff0c;Kotlin import android.os.Bundle import android.os.Trace import android.util.Log import androidx.appcompat.app.AppCompatActivityclass ImageActivity : AppCompatActivity() {companion object {const val TRACE_TA…

Lua的table(表)

Lua表的基本概念 Lua中的表&#xff08;table&#xff09;是一种多功能数据结构&#xff0c;可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制&#xff0c;其他数据结构如数组、列表、队列等都可以通过表来实现。 表的实现 Lua的表由两部分组成&#xff1a; 数组部分…

51页精品PPT | 农产品区块链溯源信息化平台整体解决方案

PPT展示了一个基于区块链技术的农产品溯源信息化平台的整体解决方案。它从建设背景和需求分析出发&#xff0c;强调了农产品质量安全溯源的重要性以及国际国内的相关政策要求&#xff0c;指出了食品安全问题在流通环节中的根源。方案提出了全面感知、责任到人、定期考核和追溯反…

Jenkins 自动打包项目镜像部署到服务器 ---(前端项目)

Jenkins 新增前端项目Job 指定运行的节点 选择部署运行的节点标签&#xff0c;dev标签对应开发环境 节点的远程命令执行配置 jenkins完整流程 配置源码 拉取 Credentials添加 触发远程构建 配置后可以支持远程触发jenkins构建&#xff08;比如自建的CICD自动化发布平台&…

使用AoT让.NetFramework4.7.2程序调用.Net8编写的库

1、创建.Net8的库&#xff0c;双击解决方案中的项目&#xff0c;修改如下&#xff0c;启用AoT&#xff1a; <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><OutputType>Library</OutputType><PublishAot>true</PublishAot>&…

第49天:Web开发-JavaEE应用SpringBoot栈模版注入ThymeleafFreemarkerVelocity

#知识点 1、安全开发-JavaEE-开发框架-SpringBoot&路由&传参 2、安全开发-JavaEE-模版引擎-Thymeleaf&Freemarker&Velocity 一、开发框架-SpringBoot 参考&#xff1a;https://springdoc.cn/spring-boot/ 访问SpringBoot创建的网站 1、路由映射 RequestMapping…

数据集笔记:NUSMods API

1 介绍 NUSMods API 包含用于渲染 NUSMods 的数据。这些数据包括新加坡国立大学&#xff08;NUS&#xff09;提供的课程以及课程表的信息&#xff0c;还包括上课地点的详细信息。 可以使用并实验这些数据&#xff0c;它们是从教务处提供的官方 API 中提取的。 该 API 由静态的…

SpringBoot新闻推荐系统设计与实现

随着信息时代的快速发展&#xff0c;新闻推荐系统成为用户获取个性化内容的重要工具。本文将介绍一个幽络源的基于SpringBoot开发的新闻推荐系统&#xff0c;该系统功能全面&#xff0c;操作简便&#xff0c;能够满足管理员和用户的多种需求。 管理员模块 管理员模块为系统管…

谷歌推出PaliGemma 2 mix:用于多任务的视觉语言模型,开箱即用。

去年 12 月&#xff0c;谷歌推出了 PaliGemma 2 &#xff0c;这是Gemma系列中的升级版视觉语言模型。该版本包含不同大小&#xff08;3B、10B 和 28B 参数&#xff09;的预训练检查点&#xff0c;可轻松针对各种视觉语言任务和领域进行微调&#xff0c;例如图像分割、短视频字幕…

linux中断调用流程(arm)

文章目录 ARM架构下Linux中断处理全流程解析&#xff1a;从硬件触发到驱动调用 ⚡**一、中断触发与硬件层响应** &#x1f50c;**1. 设备触发中断** &#x1f4e1; **二、CPU阶段&#xff1a;异常入口与上下文处理** &#x1f5a5;️**1. 异常模式切换** &#x1f504;**2. 跳转…

250301-OpenWebUI配置DeepSeek-火山方舟+硅基流动+联网搜索+推理显示

A. 最终效果 B. 火山方舟配置&#xff08;一定要点击添加&#xff09; C. 硅基流动配置&#xff08;最好要点击添加&#xff0c;否则会自动弹出所有模型&#xff09; D. 联网搜索配置 E. 推理过程显示 默认是没有下面的推理过程的显示的 设置步骤&#xff1a; 在Functions函…

【算法】图论 —— Floyd算法 python

洛谷 B3647 【模板】Floyd 题目描述 给出一张由 n n n 个点 m m m 条边组成的无向图。 求出所有点对 ( i , j ) (i,j) (i,j) 之间的最短路径。 输入格式 第一行为两个整数 n , m n,m n,m&#xff0c;分别代表点的个数和边的条数。 接下来 m m m 行&#xff0c;每行三…

Windows 11【1001问】查看Windows 11 版本的18种方法

随着技术的飞速发展&#xff0c;操作系统作为连接硬件与软件的核心桥梁&#xff0c;其版本管理和更新变得尤为重要。对于用户而言&#xff0c;了解自己设备上运行的具体Windows 11版本不仅有助于优化系统性能&#xff0c;还能确保安全性和兼容性。然而&#xff0c;不同场景和需…

(视频教程)Compass代谢分析详细流程及python版-R语言版下游分析和可视化

不想做太多的前情解说了&#xff0c;有点累了&#xff0c;做了很久的内容&#xff0c;包括整个分析&#xff0c;从软件安装和报错解决到后期下游python版-R语言版下游分析和可视化&#xff01;单细胞代谢分析我们写过很多了&#xff0c;唯独少了最“高级”的compass&#xff0c…

文件描述符与重定向

1. open系统调用 在 Linux 中, open() 系统调用用于打开一个文件或设备&#xff0c;并返回一个文件描述符&#xff0c;通过该描述符可以进行文件读写操作。open() 可以用于创建新文件或打开已存在的文件&#xff0c;具体行为取决于传递给它的参数。 需要包含的头文件&#xf…

基于fast-whisper模型的语音识别工具的设计与实现

目录 摘 要 第1章 绪 论 1.1 论文研究主要内容 1.1.1模型类型选择 1.1.2开发语言的选择 1.2 国内外现状 第2章 关键技术介绍 2.1 关键性开发技术的介绍 2.1.1 Faster-Whisper数据模型 2.1.2 Django 第3章 系统分析 3.1 构架概述 3.1.1 功能构架 3.1.2 模块需求描述 3.2 系统开…

场内、场外期权怎么开户?期权佣金是多少?

期权交易需要一定的知识和经验&#xff0c;以有效管理风险和制定策略。 场内期权开户&#xff08;以50ETF为例&#xff09; 场内期权开户的各种方式大差不差&#xff0c;咱们就先以50ETF期权为例子看下。 场内期权开户条件包括&#xff1a; 首先是资金的要求&#xff0c;50万…

Linux:进程概念

目录 1 冯诺依曼体系 2 操作系统(Operator System) 3 如何理解管理 3.1计算机管理硬件 3.2 管理逻辑图 3.3 怎样管理 4 什么是进程&#xff1f; 5 查看进程 5.1 ps ajx显示所有进程信息 5.2 /proc(内存文件系统) 5.2.1 ls /proc/PID 5.2.2 ls /proc/PID -al ​ 5…

Rabbit MQ 高频面试题【刷题系列】

文章目录 一、公司生产环境用的什么消息中间件&#xff1f;二、Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优缺点&#xff1f;三、解耦、异步、削峰是什么&#xff1f;四、消息队列有什么缺点&#xff1f;五、RabbitMQ一般用在什么场景&#xff1f;六、简单说RabbitMQ有哪些角…

【NLP 28、一文速通NLP文本分类任务 —— 深度学习】

目录 一、深度学习 — pipeline 流水线 1.配置文件 config.py Ⅰ、路径相关 Ⅱ、模型相关 Ⅲ、训练相关 2.数据加载 loader.py Ⅰ、类初始化 Ⅱ、加载数据并预处理 Ⅲ、文本编码 Ⅳ、对输入序列截断或填充 Ⅴ、返回数据长度 Ⅵ、返回对应索引位置元素 Ⅶ、加载词表 Ⅷ、封装数据…