第一发lg[]没开够RE了,下了数据本地一直停止运行,还以为是dfs死了,绝望一交,A了。。。

判断\(x\)是否在路径\(s-t\)上,只需满足

\(dep_{x} >= dep_{LCA(s,t)}\)

\(LCA(s, x) = x\) \(or\) \(LCA(t, x) = x\)

//#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define R(a,b,c) for(register int a = (b); a <= (c); ++ a)
#define nR(a,b,c) for(register int a = (b); a >= (c); -- a)
#define Max(a,b) ((a) > (b) ? (a) : (b))
#define Min(a,b) ((a) < (b) ? (a) : (b))
#define Fill(a,b) memset(a, b, sizeof(a))
#define Swap(a,b) a^=b^=a^=b
#define ll long long
#define ON_DEBUG #ifdef ON_DEBUG #define D_e_Line printf("\n\n----------\n\n")
#define D_e(x) cout << #x << " = " << x << endl
#define Pause() system("pause") #else #define D_e_Line ; #endif struct ios{
template<typename ATP>ios& operator >> (ATP &x){
x = 0; int f = 1; char c;
for(c = getchar(); c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
while(c >= '0' && c <= '9') x = x * 10 + (c ^ '0'), c = getchar();
x*= f;
return *this;
}
}io;
using namespace std; const int N = 100007; struct Edge{
int nxt, pre;
}e[N << 1];
int head[N], cntEdge;
inline void add(int u, int v){
e[++cntEdge] = (Edge){head[u], v}, head[u] = cntEdge;
} int dep[N], f[N][19];
int lg[N];
inline void DFS(int u, int fa){
dep[u] = dep[fa] + 1, f[u][0] = fa;
for(register int i = 1; (1 << i) <= dep[u]; ++i){
f[u][i] = f[f[u][i - 1]][i - 1];
}
for(register int i = head[u]; i; i = e[i].nxt){
int v = e[i].pre;
if(v == fa) continue; DFS(v, u);
}
}
inline int LCA(int x, int y){
if(dep[x] < dep[y]) Swap(x, y);
while(dep[x] > dep[y]){
x = f[x][lg[dep[x] - dep[y]] - 1];
}
if(x == y) return x;
nR(i,lg[dep[x]] - 1,0){
if(f[x][i] != f[y][i]){
x = f[x][i];
y = f[x][i];
}
}
return f[x][0];
} //int fa[N], siz[N], son[N], dep[N];
//inline void DFS_First(int u, int father){
// fa[u] = father, siz[u] = 1, dep[u] = dep[father] + 1;
// for(register int i = head[u]; i; i = e[i].nxt){
// int v = e[i].pre;
// if(v == father) continue;
// DFS_First(v, u);
// siz[u] += siz[v];
// if(!son[u] || siz[v] > siz[son[u]]){
// son[u] = v;
// }
// }
//}
//int top[N], dfn[N], dfnIdx;
//inline void DFS_Second(int u, int ancester){
// top[u] = ancester, dfn[u] = ++dfnIdx;
// if(!son[u]) return;
// DFS_Second(son[u], ancester);
// for(register int i = head[u]; i; i = e[i].nxt){
// int v = e[i].pre;
// if(v != fa[u] && v != son[u]){
// DFS_Second(v, v);
// }
// }
//}
//inline int LCA(int x, int y){
// while(top[x] != top[y]){
// if(dep[top[x]] < dep[top[y]]) Swap(x, y);
// x = fa[top[x]];
// }
// return dep[x] < dep[y] ? x : y;
//} int main(){
// freopen("in.txt","r",stdin);
// freopen("my.txt","w",stdout);
int n, Ques;
io >> n >> Ques;
R(i,2,n){
int u, v;
io >> u >> v;
add(u, v);
add(v, u);
}
R(i,1,n) lg[i] = lg[i - 1] + ((1 << lg[i - 1]) == i); // DFS_First(1, 0);
// DFS_Second(1, 1); DFS(1, 0); while(Ques--){
int a, b, c, d;
io >> a >> b >> c >> d; int S1 = LCA(a, b), S2 = LCA(c, d);
if(dep[S1] < dep[S2]){
Swap(S1, S2);
c = a;
d = b;
}
if(LCA(S1, c) == S1 || LCA(S1, d) == S1)
printf("Y\n");
else
printf("N\n");
} return 0;
}

Luogu3398 仓鼠找sugar (LCA)的更多相关文章

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

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

  2. luogu P3398 仓鼠找sugar [LCA]

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

  3. 洛谷10月月赛Round.1| P3398 仓鼠找sugar[LCA]

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

  4. 仓鼠找sugar(LCA)

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

  5. P3398 仓鼠找sugar[LCA]

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

  6. [luogu3398][仓鼠找sugar]

    luogu3398 思路: 假设松鼠a要从a1去a2,松鼠b要从b1去b2,ks表示lca(a1,a2)和lca(b1,b2)中深度较深的那个.那么,若要使得两只松鼠可能相遇,则只要满足lca(a1, ...

  7. p3398 仓鼠找sugar (LCA+讨论)

    分情况讨论,结果是两条路径有公共点时,深度大的LCA在另一条路径上且另一条路径的两个端点至少其中一个的与深度大的LCA的LCA为那个深度大的LCA #include <cstdio> #i ...

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

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

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

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

随机推荐

  1. hexo + typora 图片插入解决办法

    Typora 是一款知名的 Markdown 编辑器,简单好用,体验良好.使用 hexo 搭建好博客后,主要是用 Markdown 来编写博客,typora 便是我的首选编辑器.但直接使用 typor ...

  2. NBMiner42.1版本发布,完全解锁30系LHR版本显卡

    2021年下半年,NVIDIA发布了LHR版本显卡,对显卡算力进行了限制. 2022年5月8日,NBMiner发布NBMiner_41.0版本,在最新的内核中加入了100%LHR解锁器,适用于Wind ...

  3. 【多线程与高并发原理篇:4_深入理解synchronized】

    1. 前言 越是简单的东西,在深入了解后发现越复杂.想起了曾在初中阶段,语文老师给我们解说<论语>的道理,顺便给我们提了一句,说老子的无为思想比较消极,学生时代不要太关注.现在有了一定的生 ...

  4. iview 酸爽debug: subMenu默认选中无效的解决方法

    一. 在iview中写一个submenu <Col span="3" type="flex" v-if="showCids"> ...

  5. java中关于@override注解的使用

    @Override是伪代码,表示重写,作用有:1.可以当注释用,方便阅读:2.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.例如:如果想重写父类的方法,比如to ...

  6. idea 中菜单栏定位到类的图标消失(小齿轮按钮)

    本文链接:https://www.cnblogs.com/hchengmx/p/14533349.html 在2019.2以及以下版本 勾选:Autoscroll from source: 在2019 ...

  7. 分享一个基于 netty 的 java 开源项目

    1.简介 中微子代理(neutrino-proxy)是一个基于 netty 的.开源的 java 内网穿透项目.遵循 MIT 许可,因此您可以对它进行复制.修改.传播并用于任何个人或商业行为. 2.项 ...

  8. 【Redis】哨兵初始化和主观下线

    在的redis启动函数main(server.c文件)中,对哨兵模式进行了检查,如果是哨兵模式,将调用initSentinelConfig和initSentinel进行初始化,initServer函数 ...

  9. 机器学习中 TP FP TN FN的概念

    二分类 在二分类问题中,TP FP TN FN 是非常清楚且易于理解的. TP (True Positive) : 预测为 1 ,真实值也为 1 -> 真阳性 FP (False Positiv ...

  10. npm uninstall和rm直接删除的区别

    结论: 1. npm uninstall会备份包本身依赖的node_modules,rm -f会删除整个目录 2. npm uninstall不会删除被依赖的包.即使显式要删除这个包,但它被依赖不会删 ...