题目链接:https://www.luogu.org/problemnew/show/P3398

辣鸡树剖1300ms

倍增大法吼啊

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 550000;
const int maxlog = 20;
int n, m, root, f[maxn][maxlog], deep[maxn];
struct edge{
int next, to;
}e[maxn<<2];
int head[maxn], cnt;
void add(int u, int v)
{
e[++cnt].next = head[u]; e[cnt].to = v; head[u] = cnt;
e[++cnt].next = head[v]; e[cnt].to = u; head[v] = cnt;
}
void dfs(int u, int p, int d)
{
f[u][0] = p;
deep[u] = d;
for(int i = head[u]; i != -1; i = e[i].next)
if(e[i].to != p) dfs(e[i].to, u, d+1);
}
void init()
{
dfs(root, -1, 1);
for(int i = 0; i + 1 < maxlog; i++)
{
for(int u = 1; u <= n; u++)
if(f[u][i] < 0) f[u][i+1] = -1;
else f[u][i+1] = f[f[u][i]][i];
}
}
int LCA(int x, int y)
{
if(deep[x] > deep[y]) swap(x,y);
for(int i = 0; i < maxlog; i++)
{
if(deep[x] == deep[y]) break;
if((deep[y]-deep[x])>>i&1) y = f[y][i];
}
if(x == y) return x;
for(int i = maxlog-1; i >= 0; i--)
{
if(f[x][i] != f[y][i])
{
x = f[x][i];
y = f[y][i];
}
}
return f[x][0];
}
int main()
{
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(int i = 1; i < n; i++)
{
int u, v;
scanf("%d%d",&u,&v);
add(u,v);
}
root = 1;
init();
for(int i = 1; i <= m; i++)
{
int a, b, c, d, p, q;
scanf("%d%d%d%d",&a,&b,&c,&d);
p = LCA(a,b);
q = LCA(c,d);
if((deep[p] > deep[c]) && (deep[p] > deep[d]))
{
printf("N\n");
continue;
}
if((deep[q] > deep[a]) && (deep[q] > deep[b]))
{
printf("N\n");
continue;
}
if(deep[p] >= deep[q])
{
if((LCA(p,c) == p) || (LCA(p,d) == p))
{
printf("Y\n");
continue;
}
}
if(deep[q] >= deep[p])
{
if((LCA(q,a) == q) || (LCA(q,b) == q))
{
printf("Y\n");
continue;
}
}
printf("N\n");
}
return 0;
}

【luogu P3398 仓鼠找sugar】 题解的更多相关文章

  1. luogu P3398 仓鼠找sugar [LCA]

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

  2. 洛谷 P3398 仓鼠找sugar 题解

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

  3. Luogu P3398 仓鼠找sugar

    这还是一道比较好的树剖题(去你的树剖,LCA即可) 这里主要讲两种思路,其实都是很基本也很经典的 1 树链剖分 还是先讲一下这种算法吧,虽然写起来很烦(不过感觉写多了就习惯了,而且还有一种莫名的快感) ...

  4. P3398 仓鼠找sugar

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

  5. [Luogu 3398] 仓鼠找sugar

    [Luogu 3398] 仓鼠找sugar 又是 LCA- 前两天死活写不过的一个题今天终于顺手切了. 思路嘛参考了一楼题解. 就是说,对于 a, b, c, d 四个点, 令 x = LCA(a, ...

  6. Luogu P3412 仓鼠找$sugar$ $II$

    Luogu P3412 仓鼠找\(sugar\) \(II\) 题目大意: 给定一棵\(n\)个点的树, 仓鼠每次移动都会等概率选择一个与当前点相邻的点,并移动到此点. 现在随机生成一个起点.一个终点 ...

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

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

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

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

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

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

随机推荐

  1. Hadoop Ecosytem

    There are a lot of Hadoop related projects which are open sourced and widely used by many componies. ...

  2. Java关键字final、static使用总结 (final static在容器中不可以改变容器但可以改变存放)

    一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效 ...

  3. JDK7之HashMap源码

    并发场景下使用HashMap的问题分析:疫苗:Java HashMap的死循环 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6423457 ...

  4. Steamworks and Unity – P2P多人游戏

    之前我们讨论过“如何把Steamworks.Net和Unity整合起来”,这是一个很好的开始,现在我们研究深一点,谈一谈Steam中的多人游戏.这不是教程,但是可以指导你在你的游戏中如何使用Steam ...

  5. unity5.5 5.6 使用c#6.0或7.0

    http://blog.csdn.net/davied9/article/details/77281393

  6. IE中使用TerraExplorerPro ActiveX控件问题总结

    近段时间,由于工作需要,涉及到Skyline Web的二次开发,遇到一些问题: 问题1:IE中无法使用Skyline 提供的ActiveX Component 的API 解决方法:这个问题一般是没有正 ...

  7. 【Shell】按行读取文件内容

    方法1:while循环中执行效率最高,最常用的方法. function while_read_LINE_bottm(){ While read LINE do echo $LINE done < ...

  8. MyEclipse 中tomcat 调试时进入未打断点的代码

    在preferences里面取消挂起未捕获异常

  9. 关于C#的Lock锁思考

    大家都知道多线程并发时候存在一个线程同步的问题,一般使用lock关键字来处理. lock关键字的结果如下: object locker=new object(); lock(locker) { ... ...

  10. 位运算(6)——Number Complement

    Given a positive integer, output its complement number. The complement strategy is to flip the bits ...