仓鼠找sugar
题目传送门
参考 \(whm\) 大佬的博客 这儿
代码不难,难在思路上。
令 \(X = lca(a,b) Y = lca(c,d)\)
仓鼠 \((cs)\) 的路径可以分为从a到X,和从X到b两部分。 基友 \((jy)\) 路径也可以分为从c到Y,和从Y到d两部分。
如果仓鼠和基友相遇的话,可以分为四种情况(向上走或向下走)。
相遇时状态:
- \(cs\) 从a到X, \(jy\) 从c到Y
满足条件的话:则 \(A=depth[lca(a,c)]>=max(depth[X],depth[Y])\)
原因:每个点向上的路径是唯一的,深度越浅的点越靠上。
- \(cs\) 从X到b ,\(jy\) 从c到Y
满足条件的话:则 \(B=depth[lca(b,c)]>=max(depth[X],depth[Y])\)
- \(cs\) 从a到X, \(jy\) 从Y到d
满足条件的话:则 \(C=depth[lca(a,d)]>=max(depth[X],depth[Y])\)
- \(cs\) 从X到b, \(jy\) 从Y到d
满足条件的话:则 \(D=depth[lca(b,d)]>=max(depth[X],depth[Y])\)
以上四个条件,满足一个即可。所以只需满足 \(max(mxa(A,B),max(C,D))>=mxa(depth[X],depth[Y])\) 。
所以,六次LCA+比较大小
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 500005;
int n,q,head[N],tot,fa[N][33];
int dep[N];
struct edge{
int node,next;
}e[N<<1];
inline int read()
{
int ans=0,w=1;
char c=getchar();
while((c<'0'||c>'9')&&c!='-') c=getchar();
if(c=='-') { w=-1; c=getchar(); }
while(c>='0'&&c<='9')
{ ans=ans*10+c-'0'; c=getchar();}
return ans*w;
}
inline void add(int x,int y)
{
e[++tot].node=y;
e[tot].next=head[x];
head[x]=tot;
}
void dfs(int u,int f)
{
dep[u]=dep[f]+1;
fa[u][0]=f;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].node;
if(v==f) continue;
dfs(v,u);
}
}
void work()
{
for(int i=1;i<=32;i++)
for(int j=1;j<=n;j++)
fa[j][i]=fa[fa[j][i-1]][i-1];
}
int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int i=32;i>=0;i--)
if(dep[fa[x][i]]>=dep[y])
x=fa[x][i];
if(x==y) return x;
for(int i=32;i>=0;i--)
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
int main()
{
n=read(); q=read();
// int s=read();
int x,y,a,b,c,d;
for(int i=1;i<n;i++)
{
x=read(); y=read();
add(x,y); add(y,x);
}
dfs(1,0); work();
/* for(int i=1;i<=q;i++)
{
a=read(); b=read();
printf("%d\n",lca(a,b));
}*/
for(int i=1;i<=q;i++)
{
a=read(); b=read();
c=read(); d=read();
int X=lca(a,b),Y=lca(c,d);
X=max(dep[X],dep[Y]);
int A=lca(a,c),B=lca(a,d),C=lca(b,c),D=lca(b,d);
A=max(max(dep[A],dep[B]),max(dep[C],dep[D]));
if(A>=X) printf("Y\n");
else printf("N\n");
}
return 0;
}
竟然因为lcaWA了两次……
仓鼠找sugar的更多相关文章
- P3398 仓鼠找sugar
P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- Luogu P3412 仓鼠找$sugar$ $II$
Luogu P3412 仓鼠找\(sugar\) \(II\) 题目大意: 给定一棵\(n\)个点的树, 仓鼠每次移动都会等概率选择一个与当前点相邻的点,并移动到此点. 现在随机生成一个起点.一个终点 ...
- 【Luogu3398】仓鼠找sugar(树链剖分)
[Luogu3398]仓鼠找sugar(树链剖分) 题面 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他 ...
- 洛谷P3398 仓鼠找sugar [LCA]
题目传送门 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- 【洛谷】【lca+结论】P3398 仓鼠找sugar
[题目描述:] 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室 ...
- [Luogu 3398] 仓鼠找sugar
[Luogu 3398] 仓鼠找sugar 又是 LCA- 前两天死活写不过的一个题今天终于顺手切了. 思路嘛参考了一楼题解. 就是说,对于 a, b, c, d 四个点, 令 x = LCA(a, ...
- 洛谷 P3398 仓鼠找sugar 解题报告
P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- 【树链剖分/倍增模板】【洛谷】3398:仓鼠找sugar
P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- P3398 仓鼠找sugar(树链剖分)
P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- 仓鼠找sugar(lca)
洛谷——P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅( ...
随机推荐
- Java遍历List5种方法的效率对比
package com.test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** ...
- jsp使用
session.setAttribute("sessionName",Object); 用来设置session值的,sessionName是名称,object是你要保存的对象. s ...
- P1744 采购特价商品
原题链接 https://www.luogu.org/problemnew/show/P1744 一道最短路的模板题.....很简单吧 求最短路的方法有很多,但是对于刚学完Floyd的我,只会用这个. ...
- 洛谷P1197 [JSOI2008]星球大战
题目 由于题目不要求强制在线,所以可以离线. 而离线的话就会带来许多便利,所以我们可以先处理出全部打击后的图,通过并查集来判断是否连通. 然后再从后往前枚举,得出答案 #include <bit ...
- python——redis
redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sor ...
- Java 获取当前线程、进程、服务器ip
/** * 获取当前线程id */ private Long getThreadId() { try { return Thread.currentThread().getId(); } catch ...
- python并发编程之IO阻塞基础知识点
IO模型 解决IO问题的方式方法 问题是:IO操作阻塞程序执行 解决的也仅仅是网络IO操作 一般数据传输经历的两个阶段,如图: IO阻塞模型分类: 阻塞IO 非阻塞IO 多路复用IO 异步IO(爬 ...
- CF739E Gosha is hunting DP+wqs二分
我是从其他博客里看到这题的,上面说做法是wqs二分套wqs二分?但是我好懒呀,只用了一个wqs二分,于是\(O(nlog^2n)\)→\(O(n^2logn)\) 首先我们有一个\(O(n^3)\)的 ...
- 在PHP中如何把数组写成配置文件
1.配置文件 <?php return array ( 556770 => '65460d6684dcad3d0a92f1feb7fde199', 567701 => '9c2acd ...
- 构建之法助教园地第一次作业--点评<西北师范大学|李晓婷>
一 博客点评 第一次作业--准备篇:https://www.cnblogs.com/Mookiepiece/p/10464606.html#4192515 点评内容: 首先,你对电脑很感兴趣,兴趣就是 ...