《P3398 仓鼠找 sugar》

题目描述

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

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

输入格式

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

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

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

输出格式

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

输入输出样例

输入 #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% 的数据 n,q≤200。

40% 的数据 n,q≤2×103。

70% 的数据 n,q≤5×104。

100% 的数据 1≤n,q≤105。

代码实现:

#include<bits/stdc++.h>
using namespace std;

const int MAX_NODE = 100010;
int f[MAX_NODE][25], depth[MAX_NODE], distance[MAX_NODE];
int logLevel, totalNodes, totalQueries, edgeCount;
int adjVer[2*MAX_NODE], adjNext[2*MAX_NODE], adjHead[MAX_NODE];
queue<int> bfsQueue;

void addEdge(int fromNode, int toNode) {
adjVer[++edgeCount] = toNode;
adjNext[edgeCount] = adjHead[fromNode];
adjHead[fromNode] = edgeCount;
}

int findLCA(int nodeA, int nodeB) {
if (depth[nodeA] > depth[nodeB]) {
swap(nodeA, nodeB);
}
for (int k = logLevel; k >= 0; k--) {
if (depth[f[nodeB][k]] >= depth[nodeA]) {
nodeB = f[nodeB][k];
}
}
if (nodeA == nodeB) {
return nodeA;
}
for (int k = logLevel; k >= 0; k--) {
if (f[nodeA][k] != f[nodeB][k]) {
nodeA = f[nodeA][k];
nodeB = f[nodeB][k];
}
}
return f[nodeA][0];
}

int getDistance(int nodeX, int nodeY) {
int lcaNode = findLCA(nodeX, nodeY);
return distance[nodeX] + distance[nodeY] - 2 * distance[lcaNode];
}

int main() {
scanf("%d%d", &totalNodes, &totalQueries);
logLevel = (int)(log(totalNodes) / log(2)) + 1;

for (int i = 1; i <= totalNodes; i++) {
adjHead[i] = 0;
depth[i] = 0;
}

for (int i = 1; i < totalNodes; i++) {
int from, to;
scanf("%d%d", &from, &to);
addEdge(from, to);
addEdge(to, from);
}

bfsQueue.push(1);
depth[1] = 1;
distance[1] = 0;

while (!bfsQueue.empty()) {
int currentNode = bfsQueue.front();
bfsQueue.pop();

for (int i = adjHead[currentNode]; i; i = adjNext[i]) {
int neighborNode = adjVer[i];
if (depth[neighborNode]) {
continue;
}
depth[neighborNode] = depth[currentNode] + 1;
distance[neighborNode] = distance[currentNode] + 1;
f[neighborNode][0] = currentNode;
for (int k = 1; k <= logLevel; k++) {
f[neighborNode][k] = f[f[neighborNode][k-1]][k-1];
}
bfsQueue.push(neighborNode);
}
}

for (int i = 1; i <= totalQueries; i++) {
int path1Start, path1End, path2Start, path2End;
scanf("%d%d%d%d", &path1Start, &path1End, &path2Start, &path2End);

int distPath1 = getDistance(path1Start, path1End);
int distPath2 = getDistance(path2Start, path2End);
int crossDist1 = getDistance(path1Start, path2Start);
int crossDist2 = getDistance(path1End, path2End);

if (distPath1 + distPath2 >= crossDist1 + crossDist2) {
printf("Y\n");
} else {
printf("N\n");
}
}

return 0;
}

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

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

相关文章

锤子助手插件功能六:启用拦截消息撤回

锤子助手插件功能六&#xff1a;启用拦截消息撤回锤子助手插件功能六&#xff1a;启用拦截消息撤回&#x1f6e1;️ 插件简介 拦截撤回消息&#xff0c;信息不再消失&#x1f527; 功能说明⚠️ 使用风险与注意事项&#x1f3af; 适合人群❤️ 结语锤子助手插件功能六&#xf…

深度解析:基于EasyX的C++黑白棋AI实现 | 算法核心+图形化实战

摘要 本文详解C黑白棋AI实现&#xff0c;使用EasyX图形库打造完整人机对战系统。涵盖&#xff1a; 递归搜索算法&#xff08;动态规划优化&#xff09; 棋盘状态评估函数设计 图形界面与音效集成 胜负判定与用户交互 附完整可运行代码资源文件&#xff0c;提供AI难度调节方案…

树同构(Tree Isomorphism)

树同构&#xff08;Tree Isomorphism&#xff09;​​ 是图论中的一个经典问题&#xff0c;主要研究两棵树在结构上是否“相同”或“等价”&#xff0c;即是否存在一种节点的一一对应关系&#xff0c;使得两棵树的结构完全一致&#xff08;不考虑节点的具体标签或位置&#xff…

分享如何在保证画质的前提下缩小视频体积实用方案

大文件在通过互联网分享或上传时会遇到很多限制&#xff0c;比如电子邮件附件大小限制、社交媒体平台的文件大小要求等。压缩后的视频文件更小&#xff0c;更容易上传到网络、发送给他人或共享在社交平台上。它是一款无需安装的视频压缩工具&#xff0c;解压后直接运行&#xf…

SpringBoot 统一功能处理(拦截器、@ControllerAdvice、Spring AOP)

文章目录拦截器快速入门拦截器详解拦截路径拦截器执行流程全局控制器增强机制(ControllerAdvice)统一数据返回格式&#xff08;ControllerAdvice ResponseBodyAdvice&#xff09;​​全局异常处理机制​​&#xff08;ControllerAdvice ExceptionHandler&#xff09;全局数据…

建筑墙壁损伤缺陷分割数据集labelme格式7820张20类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件)图片数量(jpg文件个数)&#xff1a;7820标注数量(json文件个数)&#xff1a;7820标注类别数&#xff1a;20标注类别名称:["Graffiti","Bearing","Wets…

图书管理软件iOS(iPhone)

图书管理软件iOS(iPhone)开发进度表2025/07/19图书管理软件开发开始一&#xff1a;图书管理软件开发iOS&#xff08;iPhone&#xff09;

MySQL配置性能优化

技术文章大纲&#xff1a;MySQL配置性能优化赛 引言 介绍MySQL性能优化的重要性&#xff0c;特别是在高并发、大数据场景下的挑战。概述MySQL配置优化的核心方向&#xff08;如内存、查询、索引等&#xff09;。引出比赛目标&#xff1a;通过配置调整提升MySQL性能指标&#xf…

uniapp微信小程序 实现swiper与按钮实现上下联动

1. 需求&#xff1a;页面顶部展示n个小图标。当选中某个图标时&#xff0c;下方视图会相应切换&#xff1b;反之&#xff0c;当滑动下方视图时&#xff0c;顶部选中的图标也会同步更新。 2. 思路&#xff1a; 上方scroll-view 区域渲染图标&#xff0c;并且可左右滑动&#xff…

44.sentinel授权规则

授权规则是对请求者的身份做一个判断,有没有权限来访问。 需求:一般网关负责请求的转发到微服务,可以做身份判断。但是如果具体某个微服务的访问地址直接透露给了外部,不是经过网关访问过来的。那这种就没有经过网关也就无法进行身份判断了。这时候就需要sentinel的授权规…

[硬件电路-55]:绝缘栅双极型晶体管(IGBT)的原理与应用

一、IGBT的原理&#xff1a;MOSFET与BJT的复合创新IGBT&#xff08;Insulated Gate Bipolar Transistor&#xff09;是一种复合全控型电压驱动式功率半导体器件&#xff0c;其核心设计融合了MOSFET&#xff08;金属氧化物半导体场效应晶体管&#xff09;的高输入阻抗&#xff0…

取消office word中的段落箭头标记

对于一个习惯用WPS的人来说&#xff0c;office word中的段落箭头让人非常难受&#xff0c;所以想要取消该功能点击文件-更多-选项然后在显示界面&#xff0c;找到段落标记&#xff0c;取消勾选即可最终效果

Win11 上使用 Qume 搭建银河麒麟V10 arm版虚拟机

安装全程需要下载3个文件&#xff0c;可在提前根据文章1.1、2.1、2.2网址下载。 1 QEMU软件简介与安装流程 QEMU&#xff08;Quick Emulator&#xff09;是一个开源软件&#xff0c;可以模拟不同的计算机硬件行为&#xff08;如模拟arm架构&#xff09;&#xff0c;并可以创建…

[Linux]进程 / PID

一、认识进程 --- PCB写一个死循环程序执行起来&#xff0c;观察进程ps ajx 显示所有进程用分号可以在命令行的一行中执行多条指令&#xff0c;也可以用 && &#xff1a;ps ajx | head -1 && ps ajx | grep proc终止掉进程后再查看&#xff1a;所以 ./p…

【人工智能99问】门控循环但单元(GRU)的结构和原理是什么?(13/99)

文章目录GRU&#xff08;Gated Recurrent Unit&#xff09;的结构与原理一、GRU的结构与原理1. 核心组件2. 计算原理&#xff08;数学公式&#xff09;二、GRU的使用场景三、GRU的优缺点优点&#xff1a;缺点&#xff1a;四、GRU的训练技巧五、GRU的关键改进六、GRU的相关知识与…

去中心化协作智能生态系统

摘要&#xff1a; 本报告深入HarmonyNet系统的工程实现细节&#xff0c;从开发者视角出发&#xff0c;提供了模块化的组件规范、基于API的数据交互协议、可直接执行的业务逻辑流程以及经过优化的、可渲染的系统图表。报告的核心在于将V2.0的高层架构转化为具体的模块接口&#…

FPGA自学——整体设计思路

FPGA自学——整体设计思路 1.设计定义 写一套硬件描述语言&#xff0c;能够在指定的硬件平台上实现响应的功能 根据想要实现的功能进行设定&#xff08;如&#xff1a;让LED一秒闪烁一次&#xff09; 2.设计输入 方法&#xff1a; 编写逻辑&#xff1a;使用verilog代码描述逻辑…

ubuntu下好用的录屏软件

​ 以下是 vokoscreen 的安装教程,适用于 Linux 系统。vokoscreen 是一款简单易用的屏幕录制工具,支持录制屏幕、摄像头和音频。 安装 vokoscreen vokoscreen 提供了多种安装方式,包括通过包管理器、Deb 包或 AppImage 文件。 方法 1:通过 apt 安装(Ubuntu/Debian) su…

web安全漏洞的原理、危害、利用方式及修复方法

1. 原理 Web安全漏洞通常是由于Web应用程序在设计、编码或配置过程中存在缺陷导致的。这些缺陷可能使攻击者能够获取敏感数据、破坏应用程序或利用其进行其他恶意活动。2. 常见危害数据泄露&#xff1a;攻击者可能窃取用户的个人信息、密码、信用卡信息等敏感数据。会话劫持&am…

Linux—Linux中的权限管理

Linux中的权限管理前言目录一、shell命令以及运行原理二、Linux中的权限概念1、如何实现用户账号的切换2、如何仅提升当前指令的权限3、如何将普通用户添加到信任列表三、Linux中的权限管理1、文件访问者的分类&#xff08;人&#xff09;2、文件类型和访问权限&#xff08;事物…