[题解]P3398 仓鼠找 sugar
题意简述
给定一个\(N\)个节点的树形结构。接下来有\(q\)次询问,每次询问给定\(4\)个节点\(a,b,c,d\),请计算\(a\)到\(b\)的简单路径和\(c\)到\(d\)的简单路径是否有相交的节点。对于每个询问,输出Y/N表示答案。
解题思路 & Code
通过手玩样例可以发现,\(a\sim b\)与\(c\sim d\)有相交节点,当且仅当\(lca(a,b)\)在\(c\sim d\)上,或者\(lca(c,d)\)在\(a\sim b\)上。
那么我们怎么判断一个点在一条路径上呢?
我们设路径端点为\(a,b\),要判断节点\(c\)是否在\(a\sim b\)上。
通过寻找规律,我们可以把“\(c\)在\(a\sim b\)上”归纳为下面\(2\)种情况:
- \(c\)在\(a\sim lca(a,b)\)上:\(lca(a,c)=c\)且\(lca(a,b)=lca(b,c)\)。
- \(c\)在\(b\sim lca(a,b)\)上:\(lca(b,c)=c\)且\(lca(a,b)=lca(a,c)\)。
简单证明一下:\(lca(a,c)=c\)说明\(c\)是\(a\)的祖先,而\(lca(b,c)=lca(a,b)\)又说明\(lca(a,b)\)是\(c\)的祖先。也就是说\(c\)在\(a\sim lca(a,b)\)上。\(b\)同理。
只要满足其一,就说明\(c\)在\(a\sim b\)上。我们把判断的过程写成函数onpath(a,b,c),对于每次询问,如果onpath(a,b,lca(c,d))||onpath(c,d,lca(a,b)),则输出Y,否则输出N。
就酱。
这里LCA用倍增实现,总时间复杂度\(O((N+q)\log N)\)。
点击查看代码
#include<bits/stdc++.h>
#define N 100010
using namespace std;
int dep[N],fa[N][20];
int n,q;
vector<int> G[N];
void dfs(int u,int father){
dep[u]=dep[father]+1;
fa[u][0]=father;
for(int i=1;i<20;i++)
fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i:G[u])
if(i!=father) dfs(i,u);
}
int lca(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(int i=19;i>=0;i--)
if(dep[fa[u][i]]>=dep[v])
u=fa[u][i];
if(u==v) return v;
for(int i=19;i>=0;i--)
if(fa[u][i]!=fa[v][i])
u=fa[u][i],v=fa[v][i];
return fa[u][0];
}
bool onpath(int a,int b,int c){
int ab=lca(a,b),bc=lca(b,c),ac=lca(a,c);
return (ac==c&&ab==bc)||(bc==c&&ab==ac);
}
int main(){
cin>>n>>q;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
G[u].emplace_back(v);
G[v].emplace_back(u);
}
dfs(1,0);
while(q--){
int a,b,c,d;
cin>>a>>b>>c>>d;
if(onpath(a,b,lca(c,d))||onpath(c,d,lca(a,b)))
cout<<"Y\n";
else cout<<"N\n";
}
return 0;
}
附:
给出“\(c\)在\(a\sim b\)上”归纳出的两种情况也可以这样处理:
- \(c\)在\(a\sim lca(a,b)\)上:\(lca(a,c)=c\)且\(dep[c]\ge dep[lca(a,b)]\)。
- \(c\)在\(b\sim lca(a,b)\)上:\(lca(b,c)=c\)且\(dep[c]\ge dep[lca(a,b)]\)。
简单证明一下:\(lca(a,c)=c\)说明\(c\)是\(a\)的祖先,而又有\(dep[c]\ge dep[lca(a,b)]\),将\(c\)限制在了\(a\)与\(lca(a,b)\)之间。\(b\)同理。
[题解]P3398 仓鼠找 sugar的更多相关文章
- P3398 仓鼠找sugar
P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- 洛谷 P3398 仓鼠找sugar 解题报告
P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- P3398 仓鼠找sugar(树链剖分)
P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- 洛谷P3398 仓鼠找sugar [LCA]
题目传送门 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- 【洛谷】【lca+结论】P3398 仓鼠找sugar
[题目描述:] 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室 ...
- 【luogu P3398 仓鼠找sugar】 题解
题目链接:https://www.luogu.org/problemnew/show/P3398 辣鸡树剖1300ms 倍增大法吼啊 #include <cstdio> #include ...
- 洛谷 P3398 仓鼠找sugar 题解
每日一题 day44 打卡 Analysis 首先有一个结论:先找 p1=(a,b),p2=(c,d) 的LCA的深度,在与(a,c),(a,d),(b,c),(b,d)中最深的LCA n的深度比较, ...
- luogu P3398 仓鼠找sugar [LCA]
题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...
- P3398 仓鼠找sugar 树上路径相交判断
\(\color{#0066ff}{题目描述}\) 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐 ...
- 洛谷10月月赛Round.1| P3398 仓鼠找sugar[LCA]
题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...
随机推荐
- 关于家庭宽带IPv6的开启、绑定域名、使用教程等
前言 好几年前网上就很多讨论家庭宽带支持IPv6,能怎么怎么改变生活.带来多少便利,奈何之前租的房子是房东办好的宽带,我没有权限接触到光猫,自己也一直懒得研究这个新鲜事物,前阵子自己捣鼓了一下,还是得 ...
- Manim中三种函数图像类的比较
在 Manim 库中,FunctionGraph.ImplicitFunction 和 ParametricFunction 都是用于绘制函数图像的类,但它们的适用场景.输入形式和实现方式有显著区别. ...
- 跨平台之 KMP / KMM 详解
任何事情,急于求成都是幼稚的幻想,急于求成的结果一定是不成,对此不应该有任何怀疑. 一. KMP 和 Compose Multiplatform 摘要:减少为不同平台编写和维护相同业务逻辑代码所花费的 ...
- Kubernetes配置管理
Kubernetes配置管理 ConfigMap 对于应用的可变配置在 Kubernetes 中是通过一个 ConfigMap 资源对象来实现的,许多应用经常会有从配置文件.命令行参数或者环境变量中读 ...
- 关于Node.js 构建中遇到node-gyp报错问题的解决方案记录
项目今天进行版本更新,在走阿里云流水线的时候,出现了Node.js 构建过程报错问题,抱歉详情截图如下: 经过反复排查,最终发现是因为阿里云的npm仓库的问题,于是果断更换npm仓库,执行命令如下: ...
- 实战讲解|Trino 在袋鼠云数栈的探索与实践
当前随着企业内外部数据源的不断扩展和积累,数据呈现出大规模.多样化.质量参差不齐等显著特征.如何有效激活这些结构复杂且类型多样的数据资产,挖掘其深层价值,已成为众多企业亟待解决的实际挑战. 袋鼠云数栈 ...
- BIO, NIO, AIO 大白话 - 澄澈大学生也能搞懂
最近天天吃沙县, 就拿沙县分析 BIO Block I/O 沙县分析 相近时间来了4个顾客 顾客 菜品 时间 A 筒骨饭 5min B 茄子肉丝盖饭 7min C 猪脚饭 3min D 茄子肉丝盖饭 ...
- DotTrace系列:4. 诊断窗体程序变卡之原因分析
一:背景 1. 讲故事 写这一篇是因为昨天看 dottrace 官方文档时,在评论区看到了一条不友好的评论,截图如下: 虽然语气上带有些许愤怒,但说实话人家也不是无中生有,作为 dottrace 的忠 ...
- ET框架对MongoDB的使用
一:本地测试: 1:加载DB组件 2:调整用户ID : C2G_LoginGateHandler中创建玩家时id调整.(每次重启服务端创建小人ID是一样的,插入数据库会覆盖掉上传插入的数据) 3:在 ...
- MongoDB入门实战教程(14)
MongoDB入门实战教程转眼就到了尾声,本篇我们就来总结一下MongoDB的应用开发最佳实践. 1 关于MongoDB的连接 (1)MongoDB Driver:我们最好选择与所用MongoDB服务 ...