题目传送门

参考 \(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. const命令

    一.基本用法 声明一个只读的常量,这个值不会变. const声明常量与let一样,不可重复声明. 二.本质(我困惑的地方) const实际上保证的并不是变量的值不可以改动,而是变量指向的内存地址不可改 ...

  2. 使用excel整理脚本

    的时候需要通过excel数据初始化脚本,当数据过多的时候,脚本也就很多.这里记录一个平时用excel初始化脚本的小技巧. excel中在空单元格中写如下值: ="INSERT INTO db ...

  3. 在access转sql server指定的转换无效

    今天继续昨天没解决的问题,还是继续报错数据库中“指定的转换无效”,看着这个错误都有点头大了,啊啊啊啊,因为无法再代码中寻找到具体点,只好在晚上继续查询 最后终于看到一条帖子说在转换的时候可能出现数据冲 ...

  4. 用js提取字符串中的某一段字符

    String.prototype.getQuery = function(name){var reg = new RegExp("(^|&)"+ name +"= ...

  5. Windows系统CMD下常用命令

    命令    功能ASSOC    显示或修改文件扩展名关联.ATTRIB    显示或更改文件属性.BREAK    设置或清除扩展式 CTRL+C 检查.BCDEDIT    设置启动数据库中的属性 ...

  6. js重点--原型链

    通过将一个构造函数的原型对象指向父类的实例,就可以调用父类中的实例属性及父类的原型对象属性,实现继承. function animals(){ this.type = "animals&qu ...

  7. Haproxy 安装及配置

    Haproxy介绍 HAProxy是一个特别适用于高可用性环境的TCP/HTTP开源的反向代理和负载均衡软件.实现了一种事件驱动,单一进程模型,支持非常大的并发连接,是因为事件驱动模型有更好的资源和时 ...

  8. 【小白学Lua】之Lua变长参数和unpack函数

    一.简介 Lua的变长参数和unpack函数在实际的开发中应用的还挺多的,比如在设计print函数的时候,需要支持对多个变量进行打印输出,这时我们就需要用到Lua中的变长参数和unpack函数了. 二 ...

  9. Android屏幕设置只允许上下旋转

    android:screenOrientation = ["unspecified" | "behind" |                          ...

  10. Servlet学习笔记(1)

    Servlet:Sun公司制订的一种用来扩展Web服务功能的组间规范. 第1部分 C/S和B/S介绍 1 C/S Client Server 客户端 服务器程序: 客户端需要单独开发,用户需要下载并安 ...