P3398仓鼠(LCA)
题目描述
小仓鼠的和他的基(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”。
输入输出样例
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
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)相关推荐
- P3398 仓鼠找sugar (倍增LCA)
P3398 仓鼠找sugar (倍增LCA) 前言:本来想找 t a r j a n tarjan tarjan的题做下的,结果这个标签有 t a r j a n tarjan tarjan,却是 l ...
- luogu P3398 仓鼠找sugar
P3398 仓鼠找sugar 224通过 860提交 题目提供者 fjzzq2002 标签 云端↑ 难度 提高+/省选- 时空限制 1s / 128MB 题目描述 小仓鼠的和他的基(mei)友(zi) ...
- 【洛谷】【lca+结论】P3398 仓鼠找sugar
[题目描述:] 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室 ...
- P3398 仓鼠找sugar(LCA,树剖)
题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...
- 洛谷 P3398 仓鼠找 sugar
仓鼠找 sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为 1 1 1~ n n n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室( a a ...
- luogu P3398 仓鼠找sugar(树链剖分、求树上两条路径有没有交点,爽!)
整理的算法模板合集: ACM模板 舒服,一次敲160行代码一次编译通过一次AC是真的爽! 虽然这道题可以当作简单版的树链剖分板子题了hhh 要求的是两条路径有没有交点,正解是LCA玄学证明,看的我有点 ...
- P3398 仓鼠找sugar
传送门(洛谷) 树链剖分(LCA) 题目分析,如果两个人会在路上相遇,则一个点的LCA一定在另一条链上,也就是 \;\;\; S = l c a ( a , b ) P = l c ...
- 【luogu3398】 仓鼠找sugar [LCA 倍增]
P3398 仓鼠找sugar 长期不学竞赛...导致1mol的低级错误出现 把f数组开为f[N][20] 写错判断 我烂了QAQ我好瘟死于低级错误久久无法判断出来 如果两条路径相交,那么一定有一条路径 ...
- 8/21 牛客补题+cf思维+tarjan
P3398 仓鼠找 sugar 题意:在一棵树上,给定四个点,在a和b的最短路径中能否在c和d的最短路径中相遇. 思路:可看出题目给了伪标签,不是tarjan的题.一道倍增lca的题. 1.若要满足相 ...
最新文章
- 使用wireshark分析tcp/ip报文之报文头
- Python常用的模块和简单用法
- phpweb2.0 开发实战 ----- 配置虚拟主机
- 【渝粤教育】电大中专幼儿园课程论_1作业 题库
- android坐侧菜单栏,SlidingLayoutDemo android左侧菜单栏的实现 - 下载 - 搜珍网
- 【python】set集合基础与使用
- java queue iterator_Java DelayQueue iterator()用法及代码示例
- java父类与子类的构造方法_java中的加载顺序以及父类与子类的构造方法 | 学步园...
- ARC有效的工程中导人非ARC的代码/liberary的设置方法
- 安卓编程用什么软件_STM32用什么软件编程?
- ensp下载与安装问题
- Python报错:Statements must be separated by newlines or semicolons
- 国际贸易术语_Incoterm
- Openstack1 云计算与虚拟化概念
- 查看自己本地IP地址方法
- Consul + fabio 实现自动服务发现、负载均衡 1
- 互动媒体技术——《代码本色》习作二:向量
- 设计模式---组合Composite模式
- 用GPS模块校准系统时间
- 关于金融风险数据的ETL到分析
热门文章
- 《LeetCode力扣练习》剑指 Offer 05. 替换空格 Java
- Linux入门最终集! Vue SpringBoot Mybatis-Plus Linux 阿里云!
- c#_Array.Sort()
- linux boa服务器访问 404,Linux上boa服务器的配置和使用
- 计算机辅助建筑设计亚洲学会,清华大学
- 在线shell连接服务器,Xshell如何连接服务器
- python黑色变白色_使用Python openCV PIL将黑色更改为白色,但不将白色更改为黑色...
- python一切皆对象的理解_Python中万物皆对象?的理解
- 苹果手机各种型号图片_洪湖苹果X尾插华强北档口诚信收购
- 利用CStopWatch计算并显示小车运行速度