画个图就能多少看出些规律

证明借鉴一下大牛的题解:

设从A到B,经过的深度最小的点为X 同理,C,D的为Y

题目是一个点从A出发到B 一个从C出发到D

那么从A到B可以分解成 先从A到X 再从X到B。。。 C同理

假设能相遇 那么

要么在A到X的过程A,B相遇 要么在X到B的过程A,B相遇

对于在A到X的过程相遇的情况 又可以分解为:

情况1:

在A到X的过程和 C到Y的过程 中A,B相遇 此时相遇点的深度必然大于等于MIN(X深度,Y深度)

情况2:

在A到X的过程和 Y到D的过程 中A,B相遇 此时相遇点的深度必然大于等于MIN (X深度,Y深度)

另一种情况同理。。。

所以显然只要求出MIN=min(lca(a,b),lca(c,d));(lca返回的是两个点公共祖先的最大深度)

假如lca(a,c) lca(a,d) lca(b,c) lca(b,d) 中有任意一个大于等于MIN 的话 那么可以相遇 否则不能

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,p=;
int n,q,size,father[N][p+],head[M];
int nxt[M],son[M],deep[N];
int read(){
int sum=;
char ch=getchar();
while (ch<''||ch>'')
ch=getchar();
while (ch>=''&&ch<=''){
sum=sum*+ch-'';
ch=getchar();
}
return sum;
}
void uni(int x,int y){
size++;
nxt[size]=head[x];
head[x]=size;
son[size]=y;
}
void swap(int &a,int &b){
int tmp=a;
a=b;
b=tmp;
}
void dfs(int fa,int x){
for (int k=head[x];k;k=nxt[k]){
int y=son[k];
if (y==fa)
continue;
father[y][]=x;
deep[y]=deep[x]+;
dfs(x,y);
}
}
void pre(){
for (int j=;j<=p;j++)
for (int i=;i<=n;i++)
father[i][j]=father[father[i][j-]][j-];
}
int LCA(int x,int y){
if (deep[x]<deep[y])
swap(x,y);
int d=deep[x]-deep[y];
for (int j=p;j>=;j--)
if (d&(<<j))
x=father[x][j];
if (x==y)
return x;
for (int j=p;j>=;j--)
if (father[x][j]!=father[y][j]){
x=father[x][j];
y=father[y][j];
}
return father[x][];
}
int main(){
int u,v;
size=;
n=read();
q=read();
for (int i=;i<n;i++){
u=read();
v=read();
uni(u,v);
uni(v,u);
}
deep[]=;
for (int i=;i<=n;i++)
father[i][]=i;
dfs(,);
pre();
int a,b,c,d;
for (int i=;i<=q;i++){
a=read();
b=read();
c=read();
d=read();
int lca=max(deep[LCA(a,b)],deep[LCA(c,d)]);
int l1=max(deep[LCA(a,c)],deep[LCA(a,d)]);
int l2=max(deep[LCA(b,c)],deep[LCA(b,d)]);
if (max(l1,l2)>=lca)
printf("Y\n");
else
printf("N\n");
}
return ;
}

当然我们也可以判断一下最深的LCA是否在较浅的LCA路径之外

(比如lca_min=lca(a,b),则若deep[a]<lca_max&&deep[b]<lca_max(=lca(c,d))就在外面)

在外面肯定不能相遇

否则再判断一下它是否在其路径上

判断方法,,倍增跳点即可

 #include<cstdio>
#include<cstring>
using namespace std;
const int N=,M=,p=;
int n,q,size,father[N][p+],head[M];
int nxt[M],son[M],deep[N];
int read(){
int sum=;
char ch=getchar();
while (ch<''||ch>'')
ch=getchar();
while (ch>=''&&ch<=''){
sum=sum*+ch-'';
ch=getchar();
}
return sum;
}
void uni(int x,int y){
size++;
nxt[size]=head[x];
head[x]=size;
son[size]=y;
}
void swap(int &a,int &b){
int tmp=a;
a=b;
b=tmp;
}
void dfs(int fa,int x){
for (int k=head[x];k;k=nxt[k]){
int y=son[k];
if (y==fa)
continue;
father[y][]=x;
deep[y]=deep[x]+;
dfs(x,y);
}
}
void pre(){
for (int j=;j<=p;j++)
for (int i=;i<=n;i++)
father[i][j]=father[father[i][j-]][j-];
}
int LCA(int x,int y){
if (deep[x]<deep[y])
swap(x,y);
int d=deep[x]-deep[y];
for (int j=p;j>=;j--)
if (d&(<<j))
x=father[x][j];
if (x==y)
return x;
for (int j=p;j>=;j--)
if (father[x][j]!=father[y][j]){
x=father[x][j];
y=father[y][j];
}
return father[x][];
}
int check(int x,int y){
for (int j=p;j>=;j--)
if (deep[father[x][j]]>=deep[y])
x=father[x][j];
if (x==y)
return ;
return ;
}//deep[x]>deep[y]
int main(){
int u,v;
size=;
n=read();
q=read();
for (int i=;i<n;i++){
u=read();
v=read();
uni(u,v);
uni(v,u);
}
deep[]=;
father[][]=;
dfs(,);
pre();
int a,b,c,d;
for (int i=;i<=q;i++){
a=read();
b=read();
c=read();
d=read();
int lcax=LCA(a,b);
int lcay=LCA(c,d);
if (deep[lcax]<deep[lcay]){
swap(lcax,lcay);
swap(a,c);
swap(b,d);
}//deep[lcax]>deep[lcay]
if (check(lcax,lcay)&&(check(c,lcax)||check(d,lcax)))
printf("Y\n");
else
printf("N\n");
}
return ;
}

最后想说…………LCA的pre()函数……j 如果打错从0循环的话会很GG……

因为它会WA……不一定是RE……

【洛谷P3398】仓鼠找sugar的更多相关文章

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

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

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

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

  3. 洛谷P3398 仓鼠找sugar

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

  4. 洛谷——P3398 仓鼠找sugar

    https://www.luogu.org/problem/show?pid=3398#sub 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴 ...

  5. 洛谷 P3398 仓鼠找sugar —— 树链剖分

    题目:https://www.luogu.org/problemnew/show/P3398 树链剖分一下,路径就变成线段树上的几个区间: 两条路径相交就是线段树上有区间相交,所以在相应位置打个标记, ...

  6. 洛谷 P3398 仓鼠找sugar 题解

    每日一题 day44 打卡 Analysis 首先有一个结论:先找 p1=(a,b),p2=(c,d) 的LCA的深度,在与(a,c),(a,d),(b,c),(b,d)中最深的LCA n的深度比较, ...

  7. 洛谷 [P3398] 仓鼠找sugar

    树剖求LCA 我们可以发现,两条路径ab,cd相交,当且仅当 dep[lca(a,b)]>=dep[lca(c,d)]&(lca(lca(a,b),c)==lca(a,b)||lca(l ...

  8. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

  9. 洛谷p3398仓鼠找suger题解

    我现在爱死树链剖分了 题目 具体分析的话在洛谷blog里 这里只是想放一下改完之后的代码 多了一个son数组少了一个for 少了找size最大的儿子的for #include <cstdio&g ...

  10. 洛谷 3398 仓鼠找sugar——树链剖分

    题目:https://www.luogu.org/problemnew/show/P3398 原来只要把值记录成第几次就行了. 别忘了while(top[a]!=top[b])之后还要走一步. #in ...

随机推荐

  1. JS-改变页面的颜色(一)

    需求:点击页面的按钮,改变页面的颜色 思路:一先画出最简单的页面,二想办法获取页面的body节点,三想办法修改body节点的背景颜色属性,四通过一个方法获取随机的颜色值 简单的代码片段如下所示: &l ...

  2. [转载]:fortran之format格式化输出总结

    先贴一段别人总结好的: 格式化输出的控制字符非常的丰富,但常用的并不多,一般说来:" I .F.E.A.X "是最常使用的几个格式,最 好把它们都记下来. Iw[.m] 以w个字符 ...

  3. LINUX下查看负载

    1,查看磁盘 df -h 2,查看内存大小 free free [-m|g]按MB,GB显示内存 vmstat 3,查看cpu cat /proc/cpuinfo 只看cpu数量grep " ...

  4. sublime好看的主题webstrom破解

    http://equinusocio.github.io/material-theme/ sublime jsDoc注释 Doc Blockr webstrom破解 http://15.idea.la ...

  5. 【过程改进】10分钟进阶Nuget

    目录 nuget初识 nuget本地包 nuget解决依赖冲突 nuget是什么 .net版的maven(java)? 如果你用过windows的chocolatey,mac的homebrew或许更容 ...

  6. 升级 DNX 和 DNVM

    升级命令: dnvm upgrade -u dnvm upgrade -u –runtime CoreCLR -u 表示 unstable(不稳定),不带 -u 表示升级到最新稳定(stable)版本 ...

  7. 现成的HTML5框架

    1>sencha-touch 2>phoneGap 3>jQuery mobile 4>bootstrap

  8. MongoDB中的连接池

    参见 http://www.cnblogs.com/huangfox/archive/2012/04/01/2428947.html

  9. Towers of Hanoi

    Your mission is to move the stack from the left peg to the right peg. The rules are well known: Only ...

  10. B站运维团队成长的血泪史

    胡凯,bilibili运维负责人,曾经就职于金山软件.金山网络.猎豹移动,负责运维相关工作.Bilibili是国内最大的年轻人潮流文化娱乐社区,银河系知名弹幕视频分享UGC平台.   95后二次元新人 ...