题目传送门

参考 \(whm\) 大佬的博客 这儿

代码不难,难在思路上。

令 \(X = lca(a,b) Y = lca(c,d)\)

仓鼠 \((cs)\) 的路径可以分为从a到X,和从X到b两部分。 基友 \((jy)\) 路径也可以分为从c到Y,和从Y到d两部分。

如果仓鼠和基友相遇的话,可以分为四种情况(向上走或向下走)。

相遇时状态:

  1. \(cs\) 从a到X, \(jy\) 从c到Y

满足条件的话:则 \(A=depth[lca(a,c)]>=max(depth[X],depth[Y])\)

原因:每个点向上的路径是唯一的,深度越浅的点越靠上。

  1. \(cs\) 从X到b ,\(jy\) 从c到Y

满足条件的话:则 \(B=depth[lca(b,c)]>=max(depth[X],depth[Y])\)

  1. \(cs\) 从a到X, \(jy\) 从Y到d

满足条件的话:则 \(C=depth[lca(a,d)]>=max(depth[X],depth[Y])\)

  1. \(cs\) 从X到b, \(jy\) 从Y到d

满足条件的话:则 \(D=depth[lca(b,d)]>=max(depth[X],depth[Y])\)

以上四个条件,满足一个即可。所以只需满足 \(max(mxa(A,B),max(C,D))>=mxa(depth[X],depth[Y])\) 。

所以,六次LCA+比较大小

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 500005;
int n,q,head[N],tot,fa[N][33];
int dep[N];
struct edge{
int node,next;
}e[N<<1];
inline int read()
{
int ans=0,w=1;
char c=getchar();
while((c<'0'||c>'9')&&c!='-') c=getchar();
if(c=='-') { w=-1; c=getchar(); }
while(c>='0'&&c<='9')
{ ans=ans*10+c-'0'; c=getchar();}
return ans*w;
}
inline void add(int x,int y)
{
e[++tot].node=y;
e[tot].next=head[x];
head[x]=tot;
}
void dfs(int u,int f)
{
dep[u]=dep[f]+1;
fa[u][0]=f;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].node;
if(v==f) continue;
dfs(v,u);
}
}
void work()
{
for(int i=1;i<=32;i++)
for(int j=1;j<=n;j++)
fa[j][i]=fa[fa[j][i-1]][i-1];
}
int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int i=32;i>=0;i--)
if(dep[fa[x][i]]>=dep[y])
x=fa[x][i];
if(x==y) return x;
for(int i=32;i>=0;i--)
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
int main()
{
n=read(); q=read();
// int s=read();
int x,y,a,b,c,d;
for(int i=1;i<n;i++)
{
x=read(); y=read();
add(x,y); add(y,x);
}
dfs(1,0); work();
/* for(int i=1;i<=q;i++)
{
a=read(); b=read();
printf("%d\n",lca(a,b));
}*/
for(int i=1;i<=q;i++)
{
a=read(); b=read();
c=read(); d=read();
int X=lca(a,b),Y=lca(c,d);
X=max(dep[X],dep[Y]);
int A=lca(a,c),B=lca(a,d),C=lca(b,c),D=lca(b,d);
A=max(max(dep[A],dep[B]),max(dep[C],dep[D]));
if(A>=X) printf("Y\n");
else printf("N\n");
}
return 0;
}

竟然因为lcaWA了两次……

仓鼠找sugar的更多相关文章

  1. P3398 仓鼠找sugar

    P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  2. Luogu P3412 仓鼠找$sugar$ $II$

    Luogu P3412 仓鼠找\(sugar\) \(II\) 题目大意: 给定一棵\(n\)个点的树, 仓鼠每次移动都会等概率选择一个与当前点相邻的点,并移动到此点. 现在随机生成一个起点.一个终点 ...

  3. 【Luogu3398】仓鼠找sugar(树链剖分)

    [Luogu3398]仓鼠找sugar(树链剖分) 题面 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他 ...

  4. 洛谷P3398 仓鼠找sugar [LCA]

    题目传送门 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  5. 【洛谷】【lca+结论】P3398 仓鼠找sugar

    [题目描述:] 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室 ...

  6. [Luogu 3398] 仓鼠找sugar

    [Luogu 3398] 仓鼠找sugar 又是 LCA- 前两天死活写不过的一个题今天终于顺手切了. 思路嘛参考了一楼题解. 就是说,对于 a, b, c, d 四个点, 令 x = LCA(a, ...

  7. 洛谷 P3398 仓鼠找sugar 解题报告

    P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  8. 【树链剖分/倍增模板】【洛谷】3398:仓鼠找sugar

    P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  9. P3398 仓鼠找sugar(树链剖分)

    P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  10. 仓鼠找sugar(lca)

    洛谷——P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅( ...

随机推荐

  1. [leetcode] 5.Longest Palindromic Substring-1

    开始觉得挺简单的 写完发现这个时间超限了: class Solution: def longestPalindrome(self, s: str) -> str: # longest palin ...

  2. 堆以及一些用法 QWQ这是写得最认真的板子题

    最近一直在学图论,然后吧,由于学的东西实在是太多太杂了,加上蒟蒻本蒻又经常颓,所以落了好多好多板子题的整理没写啊嘤嘤嘤,不过把这些东西学的差不多了,再一块写个整理,其实感觉还不错?????也算是很神奇 ...

  3. mybatis 插入 含有美元符号($) 字符串 报 java.lang.IndexOutOfBoundsException: No group 2 的问题

    一:问题描述: 在springboot-security框架生成BCryptPasswordEncoder()方法生成加密后的密码后,带有$符号,导致新增用户的时候插入不了,报(IndexOutOfB ...

  4. Day057--django

    1. http协议 请求的格式(request ---浏览器向服务器发送的消息) 请求方式: URL HTTP/1.1\r\n K1:V1\r\n K2:V2\r\n \r\n 请求正文/请求体(ge ...

  5. thinkphp 5.0 在appache下隐藏index.php入口代码

    一.在appache的配置文件httpd.conf中开启rewrite_module 二.启用.htaccess的配置 启用.htaccess,需要修改httpd.conf,启用AllowOverri ...

  6. ubuntu安装nginx pagespeed

    一.自动安装 使用最新稳定版本的ngx_pagespeed自动安装依赖项并构建最新的主线版nginx,请运行: $ sudo bash <(curl -f -L -sS https://ngxp ...

  7. Java第五周学习总结

    学号 2016-2017-2 <Java程序设计>第X周学习总结 教材学习内容总结 1.接口 (1)使用关键字interface来定义一个接口,接口分为接口声明和接口体,例如 interf ...

  8. windows环境下安装composer,然后使用composer安装Laravel

    Composer 不是一个包管理器,它仅仅是一个依赖管理工具,它允许你申明项目所依赖的代码库,并在你的项目中安装这些代码库.它涉及 “packages” 和 “libraries”,但它在每个项目的基 ...

  9. 局域网配置dnsmasq

    一.安装dnsmasq centos下安装dnsmasq: yum install dnsmasq 二.配置dnsmasq: 1.编辑配置文件/etc/dnsmasq.conf # 配置上行DNS,对 ...

  10. [Leetcode] 01 Matrix

    问题: https://leetcode.com/problems/01-matrix/#/description 基本思路:广度优先遍历,根据所有最短距离为N的格找到所有距离为N+1的格,直到所有的 ...