【LCA 树上两点的距离 判定点是否在某条边中】洛谷P3398 仓鼠找sugar

news/2025/3/17 17:35:57/文章来源:https://www.cnblogs.com/Phrink734/p/18339686

题目链接:P3398 仓鼠找 sugar - 洛谷 | (luogu.com.cn)

题目大意:判定一棵树上的两条边是否相交

Tag:

[LCA] [树上两点间距离的计算] [如何判断与点在某条路径上]

思路:

\[\begin{align} &1.建图\\ &2.\text{dfs}然后\ 计算出每个点的深度 和计\text{anc}(i,j)\\ &3.根据树上路径唯一的性质 \quad 如果一个点在某条边上\\ &那么u到边的两端点的距离\text{dis}(a,b) = \text{dis}(a,u)+\text{dis}(u,b)\\ &\text{dis}(a,b) = \text{depth}(a)+\text{depth}(b)-2\times\text{depth}(c)\\ & 其中c=\text{LCA}(a,b)\end{align} \]

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=2e5+9;
const int LOG = log2(N)+1;
int idx=0,head[N];
struct node{int to,val,next;
};
node e[N<<1];
bool vis[N];
int fa[N];
int anc[N][LOG];
int depth[N];
int n,Q;
int logn;
void add(int u,int v,int val){e[idx] = {v,val,head[u]};head[u] = idx++;
}
void bd(){cin>>n>>Q;logn = log2(n);memset(head,-1,sizeof(head));for(int i=1 ; i<=n-1 ; ++i){int u,v;cin>>u>>v;add(v,u,0);add(u,v,0);}
}
void dfs(int u,int fa){anc[u][0]=fa;for(int i=head[u] ; i!=-1 ; i=e[i].next){int v = e[i].to;if(v==fa) continue;depth[v] = depth[u] +1;dfs(v,u);}
}
void init(){for(int j=1 ; j<=logn ;++j){for(int i=1 ; i<=n; ++i){int v = anc[i][j-1];anc[i][j] = anc[v][j-1];}}
}
int LCA(int u,int v){if(u==v) return u;if(depth[v] > depth[u])swap(u,v);for(int i=logn ; i>=0; --i){if( depth[u] -(1<<i) >= depth[v])u =anc[u][i];}if(u == v) return u;for(int i=logn ; i>=0; --i){if(anc[u][i] != anc[v][i] ){u = anc[u][i];v = anc[v][i];}}return anc[u][0];
}
bool check(int a,int b,int c,int d){if(a==c || a==d || b==c || b==d ) return true;return false;
}
int dis(int a,int b){int c = LCA(a,b);return depth[a]+depth[b]-2*depth[c];//return abs(depth[a]-depth[c])+abs(depth[b]-depth[c]);
}
int main(){bd();dfs(1,0);init();for(int i=1 ; i<=Q ; ++i){int a,b,c,d;cin>>a>>b>>c>>d;if(check(a,b,c,d)) cout<<"Y"<<"\n";else {int len1 = dis(a,b);int len2 = dis(c,d);int join1 = LCA(a,b);int join2 = LCA(c,d);if( ( dis(a,join2) + dis(b,join2) ==len1 ) || ( dis(d,join1) + dis(c,join1) ==len2) )cout << "Y" << "\n";elsecout << "N" << "\n"; // 确保输出结果}}
}

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

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

相关文章

go-zero微服务框架的静态文件服务

目录go-zero微服务框架的静态文件服务go-zero版本新建项目目录新建 demo.api 文件生成api代码新建建太文件查看文件目录写入静态服务代码访问1.html参考文档 go-zero微服务框架的静态文件服务 go-zero版本 go-zero v1.7.0 新建项目目录mkdir demo cd demo新建 demo.api 文件 de…

代码随想录Day4

24.两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head = [1,2,3,4] 输出:[2,1,4,3]示例 2: 输入:head = [] 输出:[]示例 3: 输入:head…

Go 静态编译及在构建 docker 镜像时的应用

Go 语言具有跨平台和可移植的特点,同时还支持交叉编译,可以在一个系统上编译出运行在另一个系统上的二进制可执行文件,这是因为 Go 在编译时支持将依赖的库文件与源代码一起编译链接到二进制文件中,所以在实际运行时不再需要依赖运行环境中的库,而只需要一个二进制文件就可…

JDK与JRE区别

JDK:是整个Java的核心,包含运行环境+一系列的开发工具包 JRE:java程序开发环境+核心工具类+JVM等。不能用于编译工作。 每天坚持,终会抵达!

mysql 两种重要的日志

前言 这个不用多说,两种重要的日志分别是redo log 和 binlog,这两种,下面分别来结束。 正文 先来redo log, redo log 是inno db 引擎特有的,运用了一种wal 技术,全称是: write-ahead logging. 它的关键点就是先写日志,再写磁盘,也就是先写粉板,等不忙的时候再写账本。…

STM32H7 HAL库CubeMX 双重ADC模式同步采样详细配置+FFT计算相位差

前言 在电赛备赛期间琢磨了一下ADC同步采样的实现方式,本来是打算直接用AD7606来着,但是搞了半天也没把驱动整出来...考虑到AD7606本身采样率也拉不到太高,于是就花了几天时间把片上ADC配出来了。查资料的时候我发现关于STM32双重ADC模式的资料是真的少,用FFT算两路信号相位…

Python pymodbus类库使用学习总结

实践环境 Python 3.9.13 https://www.python.org/ftp/python/3.9.13/python-3.9.13-amd64.exe pymodbus-3.6.8-py3-none-any.whl https://files.pythonhosted.org/packages/35/19/a9d16f74548d6750acf6604fa74c2cd165b5bc955fe021bf5e1fa04acf14/pymodbus-3.6.8-py3-none-any.w…

ThinkAdmin_v6两个简单漏洞(文件读取+信息泄露)

危险函数:file_get_contents()第二次遇到侵权声明 本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。 如果您是版权持有人,并且认为您的作品被侵犯,请通…

ubuntu22.04容器安装ssh服务

除了特别说明外,否则以下命令均为ubuntu 22.04 容器内执行!!!安装 查看ubuntu22.04 有没有安装openssh-server,执行命令:sudo dpkg --list | grep ssh没有找到openssh-server的包,很显然,没有安装,那么就开始安装,执行:sudo apt install openssh-server安装完成后,…

3.Java基础语法

注释单行注释 //单行注释 //输入一个Hello World!多行注释:可以注释一段文字 /* 注释 */ //多行注释:可以注释一段文字 /* 注释 */ /* 多行注释 多行注释 多行注释 */文档注释:JavaDoc /** * @Description HelloWorld * @Author 爱吃麻辣烫的妹纸 */⭐️注意:书写注释是…

分享圣诞树+雪人+全屏动效

分享圣诞树+雪人+全屏动效 创建时间:2024年8月4号 分享之前学习老师发的几个小玩意 一、圣诞树 运行: 点击该exe即可出来一棵圣诞树。退出: 鼠标点击该圣诞树右键二、雪人 运行: 双击点开exe即可退出: 和圣诞树一样、 三、音乐:满满都是爱 运行:双击打开,该程序对鼠标的…

java:一键生成二维码工具类

前言:本工具选择了Zxing,他是一个开源的,使用java实现多种格式的1D/2D条码图像处理库, 1.pom添加依赖<!-- 二维码生成&识别组件 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>…