https://www.luogu.org/problemnew/show/P3398

题意简单概括一下就是求树上两条路径是否相交;

有这样一个性质:

if相交,则必有lca(a,b) 在路径c <-> d 上or lca(c,d) 在路径a <-> b 上;

接下来就是这样一个问题:

怎样判断一个点(x)是否在一条路径(a,b)上

如果满足以下两个条件,则在:

1.dep[x] >= lca(a,b);

2.lca(x,a) == x || lca(x,b) == x

#include <bits/stdc++.h>
#define read read()
#define up(i,l,r) for(register int i = (l);i <= (r);++i)
#define down(i,l,r) for(register int i = (l);i >= (r);i--)
#define traversal_vedge(i) for(register int i = head[u]; i ;i = e[i].nxt)
#define ll long long
using namespace std;
int read
{
int x = , f = ; char ch = getchar();
while(ch < || ch > ) {if(ch == '-')f = -; ch = getchar();}
while(ch >= && ch <=) {x = * x + ch - ;ch = getchar();}
return x * f;
}
//-----------------------------------------------------------------
const int N = ;
int n,q; struct edge{
int v,nxt;
}e[N<<];int tot,head[N]; void buildtree(int u,int v) {e[++tot] = (edge){v,head[u]}; head[u] = tot;}
//----------------------------------------------------------------- int dep[N],size[N],top[N],fa[N];
void initdfs(int u){
dep[u] = dep[fa[u]] + ;
size[u] = ; top[u] = u;
int hson_id = ,hson_size = ;
traversal_vedge(i)
{
int v = e[i].v;
if(fa[u] == v) continue;
fa[v] = u;
initdfs(v);
size[u] += size[v];
if(size[v] > hson_size) hson_id = v,hson_size = size[v];
}
if(hson_id) top[hson_id] = u;
}
int find(int u){if(top[u] == u) return u;top[u] = find(top[u]); return top[u];}
int lca(int x,int y){
if(find(x) != find(y)){
if(dep[top[x]] > dep[top[y]]) return lca(fa[top[x]],y);
else return lca(x,fa[top[y]]);
}
return dep[x] > dep[y] ? y : x;
}
//-----------------------------------------------------------------
bool ok;
void query(int x,int a,int b){
if(lca(a,x) == x || lca(b,x) == x) ok = ;
} void work(){
initdfs();
while(q--)
{
ok = ;
int a = read,b = read,c = read,d = read;
int x = lca(a,b);int y = lca(c,d);//debug y = lca(a,b)
if(dep[x] >= dep[y]) query(x,c,d);
if(!ok) if(dep[y] >= dep[x]) query(y,a,b);
if(ok == ) printf("Y\n");
else printf("N\n");
}
} void readdata(){
n = read; q = read;
up(i,,n-)
{
int u = read,v = read;
buildtree(u,v);
buildtree(v,u);
}
} int main()
{
readdata();
work();
return ;
}

P3398 仓鼠找sugar (一道LCA的裸题)的更多相关文章

  1. 仓鼠找sugar(lca)

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

  2. P3398 仓鼠找sugar

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

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

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

  4. P3398 仓鼠找sugar(树链剖分)

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

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

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

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

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

  7. luogu P3398 仓鼠找sugar [LCA]

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

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

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

  9. P3398 仓鼠找sugar[LCA]

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

随机推荐

  1. Idea安装svn插件

    1. 首先要注意:TortoiseSVN在安装的时候没有command line,在安装TortoiseSVN时,要支持Idea需要点击叉的下拉单,选择will be installed local ...

  2. 正则简单操作cookie、url search

    正则操作cookie.url getCookie function getCookie(key) { var cookies = window.document.cookie, reg = new R ...

  3. 学习python 检测字符串的方法

    检测字符串长度的方法:len() 检测字符串是否含有字母的方法:str.isalpha() 检测字符串是否含有数字的方法:str.isnumeric() 检测字符串是否有大写字母:str.upper( ...

  4. Java框架spring 学习笔记(三):Bean 的生命周期

    当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态.当bean不再需要,并且从容器中移除时,需要做一些清除工作.为了定义安装和拆卸一个 bean,我们只要声明init-metho ...

  5. 修改Windows server 时间同步

    1.关闭“与Internet时间同步”选项. 2.禁用Windows时间服务,并将其设置为手动. 3.禁用Hyper-v时间同步服务,并将其设置为手动,这个在Hyper-v软件上选中要修改的虚拟机,设 ...

  6. 4-20arget 属性和hover

    1.target 属性 定义和用法 target 属性规定在何处打开 action URL. 值 描述 _blank 在新窗口中打开. _self 默认.在相同的框架中打开. _parent 在父框架 ...

  7. Linux(centos)下安装JDK

    安装 JDK是运行java程序必不可少的环境,服务器上跑程序也不例外.首先在安装之前,要知道Linux下安装软件有两种,一种是使用yum等命令直接下载,一种是使用上传下载工具,上传至Linux下使用, ...

  8. 纯css3单选框/复选框美化样式代码

    纯CSS 单/复选框 美化请选择iPhone 型号 iPhone 6s iPhone 6s Plus iPhone 7 iPhone 7 Plus   选择兴趣爱好 女 绘画 摄影 骑行   原理在这 ...

  9. nuget安装本地nupkg文件

    打开visual studio,菜单选择‘工具’->‘选项’ 然后 接下来,选择‘程序包源’,把‘包括预发行版’打钩,然后安装需要的包到工程即可,如下图:

  10. 获取Control请求路径

    对于多个uri映射到同一个control方法时,需根据不同的uri返回的数据结构进行区分,因此需要再方法体内获取到RequestUri,再对其做相应的判断实现对应的业务逻辑 @Resource pri ...