题目描述

小仓鼠的和他的基(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<=200,q<=200

40%的数据 n<=2000,q<=2000

70%的数据 n<=50000,q<=50000

100%的数据 n<=100000,q<=100000

/*
就是找2个点之间的最近公共祖先
然后判断其中深度较深的一个公共祖先是否在另外一条最短路径上
至于怎么判断他在另外一条路径上只要倍增向上移点就好了
但是还有一种情况就是他本身在路径之外需要特判
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#define maxn 100001using namespace std;
int n,m,q,x,y,cnt,num,tot,ans,a,b,c,d;
int head[maxn],deep[maxn],v[maxn];
int f[maxn][21];
struct nodd
{int from;int to;int next;
}e[maxn*2];int init()
{int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}void add(int from,int to)
{e[++num].from=from;e[num].to=to;e[num].next=head[from];head[from]=num;
}void get_fa()
{for(int j=1;j<=20;j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];
}void Dfs(int now,int from,int c)
{f[now][0]=from;deep[now]=c;for(int i=head[now];i;i=e[i].next){int v=e[i].to;if(v!=from)Dfs(v,now,c+1);}
}int get_same(int a,int t)
{for(int i=0;i<=20;i++)//跳到20不是n!!!再错剁手!
    {if(t&(1<<i))a=f[a][i];}return a;
}int LCA(int a,int b)
{if(deep[a]<deep[b]) swap(a,b);a=get_same(a,deep[a]-deep[b]);if(a==b) return a;for(int i=20;i>=0;i--){if(f[a][i]!=f[b][i]){a=f[a][i];b=f[b][i];}}return f[a][0];
}int query(int a,int b)
{int t=deep[b]-deep[a];for(int i=0;i<=20;i++){if(t&(1<<i))b=f[b][i];//注意这里是跳b不是a。
    }return a==b;
}int main()
{n=init();q=init();for(int i=1;i<n;i++){x=init();y=init();add(x,y);add(y,x);}Dfs(1,1,0);get_fa();for(int i=1;i<=q;i++){a=init();b=init();c=init();d=init();int s1=LCA(a,b);int s2=LCA(c,d);if(deep[s1]>deep[s2]){swap(s1,s2);swap(a,c);swap(b,d);} if(query(s1,s2)&&(query(s2,a)||query(s2,b))) printf("Y\n");else printf("N\n");}return 0;
}

转载于:https://www.cnblogs.com/L-Memory/p/6368422.html

P3398仓鼠(LCA)相关推荐

  1. P3398 仓鼠找sugar (倍增LCA)

    P3398 仓鼠找sugar (倍增LCA) 前言:本来想找 t a r j a n tarjan tarjan的题做下的,结果这个标签有 t a r j a n tarjan tarjan,却是 l ...

  2. luogu P3398 仓鼠找sugar

    P3398 仓鼠找sugar 224通过 860提交 题目提供者 fjzzq2002 标签 云端↑ 难度 提高+/省选- 时空限制 1s / 128MB 题目描述 小仓鼠的和他的基(mei)友(zi) ...

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

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

  4. P3398 仓鼠找sugar(LCA,树剖)

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

  5. 洛谷 P3398 仓鼠找 sugar

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

  6. luogu P3398 仓鼠找sugar(树链剖分、求树上两条路径有没有交点,爽!)

    整理的算法模板合集: ACM模板 舒服,一次敲160行代码一次编译通过一次AC是真的爽! 虽然这道题可以当作简单版的树链剖分板子题了hhh 要求的是两条路径有没有交点,正解是LCA玄学证明,看的我有点 ...

  7. P3398 仓鼠找sugar

    传送门(洛谷) 树链剖分(LCA) 题目分析,如果两个人会在路上相遇,则一个点的LCA一定在另一条链上,也就是        \;\;\; S = l c a ( a , b )    P = l c ...

  8. 【luogu3398】 仓鼠找sugar [LCA 倍增]

    P3398 仓鼠找sugar 长期不学竞赛...导致1mol的低级错误出现 把f数组开为f[N][20] 写错判断 我烂了QAQ我好瘟死于低级错误久久无法判断出来 如果两条路径相交,那么一定有一条路径 ...

  9. 8/21 牛客补题+cf思维+tarjan

    P3398 仓鼠找 sugar 题意:在一棵树上,给定四个点,在a和b的最短路径中能否在c和d的最短路径中相遇. 思路:可看出题目给了伪标签,不是tarjan的题.一道倍增lca的题. 1.若要满足相 ...

最新文章

  1. 使用wireshark分析tcp/ip报文之报文头
  2. Python常用的模块和简单用法
  3. phpweb2.0 开发实战 ----- 配置虚拟主机
  4. 【渝粤教育】电大中专幼儿园课程论_1作业 题库
  5. android坐侧菜单栏,SlidingLayoutDemo android左侧菜单栏的实现 - 下载 - 搜珍网
  6. 【python】set集合基础与使用
  7. java queue iterator_Java DelayQueue iterator()用法及代码示例
  8. java父类与子类的构造方法_java中的加载顺序以及父类与子类的构造方法 | 学步园...
  9. ARC有效的工程中导人非ARC的代码/liberary的设置方法
  10. 安卓编程用什么软件_STM32用什么软件编程?
  11. ensp下载与安装问题
  12. Python报错:Statements must be separated by newlines or semicolons
  13. 国际贸易术语_Incoterm
  14. Openstack1 云计算与虚拟化概念
  15. 查看自己本地IP地址方法
  16. Consul + fabio 实现自动服务发现、负载均衡 1
  17. 互动媒体技术——《代码本色》习作二:向量
  18. 设计模式---组合Composite模式
  19. 用GPS模块校准系统时间
  20. 关于金融风险数据的ETL到分析

热门文章

  1. 《LeetCode力扣练习》剑指 Offer 05. 替换空格 Java
  2. Linux入门最终集! Vue SpringBoot Mybatis-Plus Linux 阿里云!
  3. c#_Array.Sort()
  4. linux boa服务器访问 404,Linux上boa服务器的配置和使用
  5. 计算机辅助建筑设计亚洲学会,清华大学
  6. 在线shell连接服务器,Xshell如何连接服务器
  7. python黑色变白色_使用Python openCV PIL将黑色更改为白色,但不将白色更改为黑色...
  8. python一切皆对象的理解_Python中万物皆对象?的理解
  9. 苹果手机各种型号图片_洪湖苹果X尾插华强北档口诚信收购
  10. 利用CStopWatch计算并显示小车运行速度